Найти длинные (>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, поэтому вы должны иметь возможность работать в каталогах по одному шагу за раз.
остерегайтесь, что многопоточные программы могут быть чувствительны к изменениям в текущей директории, так как процесс имеет только один текущий каталог общий для всех потоков.