. Но все имена файлов и папок неверны с неправильными именами кодировки (UTF-> ANSI).
"C:\...\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\..."
Обычная функция Utf8ToAnsi
сглаживает его, но FindFirst
не может искать папки с именами, длина которых превышает 255 символов.
Это дает мне только 70/100 файлов.
FindFirst является оболочкой для функции Win32 API FindFirstFile и версии этой функции в Юникоде можно искать пути длиной до 32 767 символов, если вы добавите \\? \
к пути, по которому вы проходите, например \\? \ C: \ Folder \ Folder \ *
.
Поскольку Delphi 2009 и новее вызывает функции Unicode за вас, вы можете просто использовать FindFirst и co. Для Delphi 2007 и более ранних версий (версии ANSI) вам необходимо вызвать FindFirstFile / FindNextFile / FindClose
из Windows.pas
напрямую. Дополнительные сведения см. В разделе Именование файла пакета SDK платформы.
Обратите внимание, что использование \\? \
отключает различные биты обработки пути, поэтому убедитесь, что это полностью определенный путь без каких-либо символов '.' или записи "..". Вы можете использовать тот же прием, чтобы открывать файловые потоки, переименовывать или копировать файлы с более длинными путями.
Оболочка (Explorer) не поддерживает это, поэтому вам все равно нужно ограничить их максимум MAX_PATH символами для таких вещей, как SHFileOperation
(для удаления в корзину) или ShellExecute
. Во многих случаях вы можете обойти проблему, передав имена DOS 8.3 вместо длинных. TSearchRec от FindFirst не предоставляет короткие имена, но структура FindFirstFile TWin32FindData
работает так же, как cAlternateFileName
.
Измените текущий каталог ( ChDir
) на самый глубокий, о котором вы знаете, и затем передайте относительный путь к FindFirst
или FindFirstFile
.
Ни один из компонентов пути в этом имени файла не может быть длиннее MAX_PATH символов, поэтому вы должны иметь возможность продвигаться по каталогам по одному шагу за раз.
Помните, что многопоточные программы могут быть чувствительны к изменениям в текущем каталоге, поскольку у процесса есть только один текущий каталог, совместно используемый всеми потоками.