You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不依赖winapi/windows-rs,用Rust原生IO库设置FILE_SHARE_READ和FILE_SHARE_WRITE打开文件?

不依赖外部crate实现Windows下FILE_SHARE_READ+FILE_SHARE_WRITE的文件打开方式

Rust标准库的OpenOptions没有直接暴露Windows平台特有的FILE_SHARE_READ和FILE_SHARE_WRITE配置项,但可以通过custom_flags方法手动传入底层API需要的共享模式常量来实现,无需依赖winapi或windows-rs。

具体实现步骤

  1. 手动定义Windows平台的共享模式常量(对应CreateFileW API的参数值):

    • FILE_SHARE_READ = 0x00000001
    • FILE_SHARE_WRITE = 0x00000002
      将两者按位或得到组合的共享模式值0x00000003
  2. 在OpenOptions中通过custom_flags传入该组合值,同时设置必要的文件访问权限(如read(true)、write(true))。

代码示例

use std::fs::OpenOptions;
use std::io;

#[cfg(windows)]
fn open_with_shared_access() -> io::Result<()> {
    const FILE_SHARE_READ: u32 = 0x00000001;
    const FILE_SHARE_WRITE: u32 = 0x00000002;
    const SHARE_MODE: u32 = FILE_SHARE_READ | FILE_SHARE_WRITE;

    let file = OpenOptions::new()
        .read(true)
        .write(true)
        .custom_flags(SHARE_MODE)
        .open("target_file.txt")?;

    // 后续文件操作
    Ok(())
}

#[cfg(not(windows))]
fn open_with_shared_access() -> io::Result<()> {
    // 非Windows平台的默认实现
    let file = OpenOptions::new()
        .read(true)
        .write(true)
        .open("target_file.txt")?;

    Ok(())
}

fn main() -> io::Result<()> {
    open_with_shared_access()
}

注意事项

  • custom_flags传入的标志会覆盖标准库默认的共享模式设置,无需担心冲突
  • 该实现仅适用于Windows平台,跨平台场景需用#[cfg(windows)]做条件编译
  • 确保文件访问权限(read/write)与共享模式匹配,避免出现权限错误

内容的提问来源于stack exchange,提问作者eeee25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:02:47