跨盘符文件读取异常:E盘程序无法打开有权限的C盘文件
解决CStdioFile无法打开C盘文件的问题
先别瞎猜,先给代码加上错误诊断,搞清楚到底为啥打不开:
CStdioFile f; CString sPath = _T("C:\\Folder\\test.txt"); // 打开文件失败时获取错误码 if (!f.Open(sPath, CFile::modeRead)) { DWORD errCode = GetLastError(); CString errMsg; errMsg.Format(_T("打开失败,错误码:%lu"), errCode); AfxMessageBox(errMsg); // 弹框提示错误,或者写入日志 }
拿到错误码后对应排查:
错误码5(ERROR_ACCESS_DENIED):权限问题
你说已经确认权限,但C盘根目录、Windows、Program Files这类目录受UAC保护,就算权限列表里有你的用户,普通运行程序时也会被拦截:
- 先右键程序,选「以管理员身份运行」试试,要是能打开,就是UAC的锅。
- 检查文件夹权限:右键
C:\Folder→ 属性 → 安全 → 编辑,确保当前用户的「读取」「读取和执行」权限是勾选的,并且点击「高级」确认权限是继承自父目录,或者直接应用到该文件夹和所有子文件。 - 别把文件扔C盘根目录,换用户目录比如
C:\Users\你的用户名\Documents\test.txt,这里的权限默认是开放的,不会有UAC问题。
错误码2(ERROR_FILE_NOT_FOUND):文件不存在
- 直接在资源管理器地址栏输入
C:\Folder\test.txt,看能不能打开,确认文件真的在那。 - 检查有没有隐藏文件扩展名:比如实际文件是
test.txt.txt,但你显示成了test.txt,去文件夹选项里取消「隐藏已知文件类型的扩展名」再看。
错误码3(ERROR_PATH_NOT_FOUND):文件夹不存在
确认C:\Folder这个文件夹确实存在,别打错字。
另外提个小细节:字符串最好用_T()包裹,确保Unicode/ANSI编译模式都能正常解析路径,避免字符集导致的隐性问题。
内容的提问来源于stack exchange,提问作者Joe F
相关产品推荐
相关产品推荐

