由于长路径而导致的fopen错误不存在此类文件

时间:2020-03-27 13:11:31

标签: c fopen file-handling long-filenames

我想知道fopen是否由于长路径失败或文件不存在

#include<stdio.h>
#include <errno.h>
extern int errno ;
int main(){
FILE *p;
int errnum;
p=fopen("C:\\Users\\kkm\\testtttttttttttttttttttttttttttttttttttttt\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\\ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\\b.txt","w");
//p=fopen("C:\\Users\\kkm\\testtttttttttttttttttttttttttttttttttttttt\\xxxx.txt","r");
if (p == NULL) {

      errnum = errno;
      fprintf(stderr, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
   } else {

      fclose (p);
   }
return 0;
}

第一个fopen的路径很长,而第二个fopen的路径很短,但是文件不存在。 对于这两种情况,输出都是相似的:

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

有没有办法知道区别?

1 个答案:

答案 0 :(得分:3)

使用extended-length path语法调用例程;用\\?\为路径加上前缀。

要指定扩展长度的路径,请使用“ \\?\”前缀。例如,“ \\?\ D:\ very long path”。

在您的情况下,路径应为

"\\\\?\\C:\\Users\\kkm\\testtttttttttttttttttttttttttttttttttttttt\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\\ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\\b.txt"

same link继续描述Windows 10版本1607中的一项新功能。

从Windows 10版本1607开始, MAX_PATH 的限制已从常见的Win32文件和目录功能中删除。但是,您必须选择加入新行为。

要启用新的长路径行为,必须满足以下两个条件:

  • 注册表项HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)必须存在并将其设置为1。...
  • 应用程序清单还必须包含longPathAware元素。 ...