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

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

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

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

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

7
задан Chris Seymour 10 December 2012 в 09:53
поделиться

2 ответа

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 .

13
ответ дан 6 December 2019 в 19:31
поделиться

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

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

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

0
ответ дан 6 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: