Найти длинные (>255) имена

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

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

обычная функция Utf8ToAnsi finxing его, но FindFirst не удается найти папки с именами более 255 символов.

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

2 ответов


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

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

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

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


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

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

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