Найти длинные (> 255) имена файлов - PullRequest
7 голосов
/ 11 августа 2010

Есть какая-то папка с более чем 100 файлами. Но все имена файлов и папок испорчены неправильными именами кодировки (UTF-> ANSI).

"C:\...\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\..."

Обычная функция Utf8ToAnsi Finxing, но FindFirst не может искать папки с именами длиннее 255 символов.

Это дает мне только 70/100 файлов.

Ответы [ 2 ]

13 голосов
/ 11 августа 2010

FindFirst оборачивает функцию Win32 API FindFirstFile , и версия этой функции в Юникоде может искать пути длиной до 32 767 символов, если вы добавляете \\?\ к пути, по которому вы проходите, например \\?\C:\Folder\Folder\*.

Поскольку Delphi 2009 и новее вызывают функции Unicode для вас, вы можете просто использовать FindFirst и co там.Для Delphi 2007 и более ранних версий (версии ANSI) вам нужно будет напрямую позвонить по номеру FindFirstFile/FindNextFile/FindClose из Windows.pas.Для получения дополнительной информации проверьте раздел Naming a file SDK платформы.

Обратите внимание, что использование \\?\ отключает различные биты обработки пути, поэтому убедитесь, что это полный путь безлюбой '.'или «..» записи.Вы можете использовать тот же трюк, чтобы открывать файловые потоки, переименовывать или копировать файлы с более длинными путями.

Оболочка (Проводник) не поддерживает это, поэтому вам все равно нужно ограничить их не более MAX_PATH-символамидля таких вещей, как SHFileOperation (для удаления в корзину) или ShellExecute.Во многих случаях вы можете обойти эту проблему, передавая имена DOS 8.3 вместо длинных.FindFirst TSearchRec не предоставляет короткие имена, но структура FindFirstFile TWin32FindData работает как cAlternateFileName.

0 голосов
/ 11 августа 2010

Измените текущий каталог (ChDir) на самый глубокий из известных вам, а затем передайте относительный путь на FindFirst или FindFirstFile.

Ни один компонент пути в этом имени файла не длиннее символов MAX_PATH, поэтому вы должны иметь возможность прокладывать путь к каталогам по одному шагу за раз.

Помните, что многопоточные программы могут быть чувствительными к изменениямтекущий каталог, поскольку у процесса есть только один текущий каталог, общий для всех потоков.

...