调用Windows CreateFileW打开C:\时间歇性报NotFound错误的排查与解决
问题描述
调用CreateFileW打开路径"C:\"时出现间歇性失败,错误提示为Not Found,相关Rust代码实现如下:
unsafe fn get_volume_handle_from_path(path_name: &Vec<u16>) -> Result<HANDLE, Error> { use std::os::raw::c_void; use windows_sys::Win32::{ Foundation::INVALID_HANDLE_VALUE, Storage::FileSystem::{ CreateFileW, FILE_FLAG_BACKUP_SEMANTICS, FILE_SHARE_READ, OPEN_EXISTING, }, }; let file_handle = CreateFileW( path_name.as_ptr(), 0, FILE_SHARE_READ, null(), OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, null::<*mut c_void>() as HANDLE, ); if file_handle == INVALID_HANDLE_VALUE { return Err(Error::VolumeHandle(io::Error::last_os_error())); } Ok(file_handle as HANDLE) }
示例调用代码:
path_name = "C:\\".encode_utf16().collect::<Vec<_>>() CreateFileW( path_name.as_ptr(), 0, FILE_SHARE_READ, null(), OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, null::<*mut c_void>() as HANDLE, );
可能的原因
- 缺少宽字符串终止符:Win32宽字符API(如
CreateFileW)要求输入的字符串必须以\0(u16类型的0值)结尾。当前代码中"C:\\".encode_utf16()生成的Vec<u16>仅包含路径字符,没有追加终止空字符。这会导致API读取内存中路径之后的随机数据,偶尔刚好读到0时调用成功,读到非0字符时会解析出无效路径,返回Not Found错误,表现为间歇性失败。 - 共享模式限制(次要):仅设置
FILE_SHARE_READ,若其他进程以独占写入模式占用C盘根目录,可能导致调用失败,但这类错误通常是Access Denied,不是Not Found,仅作为边缘场景考虑。
修复方案
1. 补充空终止符(核心修复)
修改路径生成代码,在encode_utf16()后追加空字符:
// 生成带空终止符的宽字符串Vec<u16> let path_name = "C:\\".encode_utf16() .chain(std::iter::once(0)) .collect::<Vec<_>>();
这是解决Not Found间歇性失败的关键,确保CreateFileW能正确识别完整路径。
2. 优化共享模式(可选)
如果存在其他进程占用根目录导致的失败场景,可以扩展共享权限,避免独占锁冲突:
// 替换原有的FILE_SHARE_READ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
此修改主要针对Access Denied错误,对Not Found问题无直接影响,但能提升调用稳定性。
3. 使用安全字符串封装(推荐)
借助windows crate提供的PCWSTR类型,它会自动处理宽字符串的空终止,避免手动管理的错误:
use windows::core::PCWSTR; use windows_sys::Win32::Storage::FileSystem::CreateFileW; // 直接从&str创建带空终止的PCWSTR let path = PCWSTR::from_str("C:\\")?; let file_handle = unsafe { CreateFileW( path.as_ptr(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, null(), OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, null::<*mut std::os::raw::c_void>() as _, ) };
内容的提问来源于stack exchange,提问作者bicarlsen
相关产品推荐
相关产品推荐

