ошибка fopen из-за длинного пути не дает такой файл существует - PullRequest
3 голосов
/ 27 марта 2020

Я хочу знать, был ли сбой fopen в C из-за длинного пути или файл не существует

#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 имеет длинный путь, тогда как второй короткий, но файл не существует. Для обоих этих случаев вывод аналогичен:

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

Есть ли способ узнать разницу?

1 Ответ

3 голосов
/ 27 марта 2020

Вызов подпрограммы с использованием синтаксиса расширенной длины ; префикс пути с \\?\.

Чтобы указать путь расширенной длины, используйте префикс "\\? \". Например, «\\? \ D: \ очень длинный путь».

В вашем случае путь будет

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

Тот же ссылка продолжает описание новой функции в Windows 10, версия 1607

Начиная с Windows 10, версия 1607, MAX_PATH ограничения были удалены из общие функции файлов и каталогов Win32. Однако вы должны подписаться на новое поведение.

Чтобы включить новое поведение длинного пути, должны быть выполнены оба из следующих условий:

  • Ключ реестра HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD) должен существовать и иметь значение 1. ...
  • Манифест приложения также должен содержать элемент longPathAware. ...
...