如何不依赖winapi/windows-rs,用Rust原生IO库设置FILE_SHARE_READ和FILE_SHARE_WRITE打开文件?
Rust标准库的OpenOptions没有直接暴露Windows平台特有的FILE_SHARE_READ和FILE_SHARE_WRITE配置项,但可以通过custom_flags方法手动传入底层API需要的共享模式常量来实现,无需依赖winapi或windows-rs。
具体实现步骤
手动定义Windows平台的共享模式常量(对应
CreateFileWAPI的参数值):FILE_SHARE_READ=0x00000001FILE_SHARE_WRITE=0x00000002
将两者按位或得到组合的共享模式值0x00000003
在
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
相关产品推荐
相关产品推荐

