【问题标题】:Why fopen failed with folder?为什么 fopen 文件夹失败?
【发布时间】:2019-10-19 16:42:44
【问题描述】:

此代码有效。

pFile = fopen("d:\myfile.txt", "w");

此代码不起作用。

pFile = fopen("d:\ABC\myfile.txt", "w");

我确实有这个文件夹 d:\ABC

操作系统是 Windows 10,使用 Visual Studio 2019。

errno 是 22。

【问题讨论】:

  • 你检查权限了吗?返回的错误码是什么?
  • 请发布错误。
  • 你不应该在"d:\\ABC...."这样的字符串中转义\吗?可能\A 是转义序列,\m 不是。
  • printf("%s\n", strerror(22)); 报告什么? Windows 上的错误消息是什么? (在 Mac 和 Linux 上,它是 EINVAL — Invalid argument;不过,这不一定是它在 Windows 上的翻译。)您也可以尝试:printf("name: [[%s]]\n", "d:\ABC\myfile.txt");,看看它给了你什么。反斜杠被“删除”的可能性很高。您应该考虑printf("name: [[%s]]\n", "d:\\ABC\\myfile.txt"); 甚至printf("name: [[%s]]\n", "d:/ABC/myfile.txt");。 Windows 程序 API 接受文件名中的斜杠;不喜欢它们的是命令提示符。
  • @Mark IMKOn 没有\m 转义序列,无论如何你不需要关心,唯一重要的是如果你想在字符串文字中有一个'\' ,您需要通过添加另一个反斜杠来转义它:例如:"Hello\\World";

标签: c windows visual-studio file


【解决方案1】:
//these are all the same
char test1[]={'\n', '\a','\t','\\','\'','\"','\0'};
char test2[]={'\N', '\A','\T','\\','\'','\"','\0'};
char test3[]={10,7,9,92,39,34,0};
char test4[]={0x0a,0x07,0x09,0x5c,0x27,0x22,0x00};
char test5[]="\n\a\t\\\'\"";
char test6[]="\N\A\T\\\'\"";

微软文件使用

"d:\\ABC\\myfile.txt";

"d:/ABC/myfile.txt";

【讨论】:

    【解决方案2】:

    这一行解决了问题:

    pFile = fopen("D:\ABC\\myfile.txt", "r");
    

    【讨论】:

    • 您应该转义该字符串中的两个 `\`。
    • 或者 - 甚至更好 - 将反斜杠字符更改为正斜杠。 Windows 完全能够应对这种情况。它不易出错且更便携。
    • @mrfo,在大多数情况下正斜杠有效,除了“\\?\”路径仅在前缀仅使用反斜杠时绕过规范化(回避MAX_PATH)的特殊情况,在这种情况下路径的其余部分也必须只使用反斜杠。另外,有点切题,如果定义了NoDefaultCurrentDirectoryInExePathCreateProcess 需要在相对路径中使用反斜杠,例如lpCommandLine 中的“ABC\\myfile.exe”;它不会找到“ABC/myfile.exe”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多