Как перебирать длинные пути с любой формой Windows API - PullRequest
7 голосов
/ 25 января 2011

У меня есть файлы на сервере, которые превышают предел MAX_PATH. Я неоднократно слышал, что вы можете перечислить эти файлы, предварительно ожидая \\? \ Пути. Однако это не решает проблему с FindFirstFile[Ex] и его партнерами, поскольку они используют структуру данных, которая ограничивает длину имени файла до MAX_PATH.

Есть ли другой способ перебора структуры каталогов для поиска файлов с слишком длинным именем? Я видел утилиты, которые делают это, но ни одна из них не доступна в исходном виде.

Обратите внимание, что я видел записи блога от людей .NET BCL и следовал по ссылкам, которые они предоставляют.

Я бы предпочел сделать это на C или C ++ для простоты, но на данный момент подойдет любой свободно доступный язык.

Указатели на код, документы или что-либо полезное приветствуются.

1 Ответ

10 голосов
/ 25 января 2011

Я не думаю, что здесь есть проблема.Вы ссылаетесь на WIN32_FIND_DATA, который действительно возвращает имена файлов, ограниченные по длине MAX_PATH.Но поскольку это только часть имени файла, а путь не указан, ограничений нет.

Внутри каталога длина объекта (файла или папки), как правило, составляет 255 символов.Вы можете определить, что это за предел, с помощью параметра lpMaximumComponentLength, равного GetVolumeInformation.Я был бы удивлен, если бы любой том, смонтированный в Windows, мог иметь максимальную длину компонента, превышающую 255.

Вызов FindFirstFile получает строку с нулевым окончанием, lpFileNameкоторый указывает каталог и имя файла (например, "* .txt", например) для поиска.В документации говорится:

В версии ANSI этой функции имя ограничено символами MAX_PATH.Чтобы расширить этот предел до 32 767 широких символов, вызовите версию функции в Юникоде и добавьте "\\? \" К пути.

...