查找长(> 255)个文件名

时间:2010-08-11 11:11:36

标签: delphi find filenames long-integer

有一些文件夹上有超过100个文件。 但所有文件和文件夹名称都以错误的编码名称(UTF-> ANSI)打破。

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

常规功能Utf8ToAnsi完成它,但FindFirst无法搜索名称长度超过255个符号的文件夹。

它只给我70/100个文件。

2 个答案:

答案 0 :(得分:13)

FindFirst包装Win32 API函数FindFirstFile,如果您将\\?\添加到您传入的路径中,该函数的Unicode版本可以搜索最多32,767个字符的路径,例如{{ 1}}。

由于Delphi 2009及更新版本为您调用Unicode函数,您可以使用FindFirst并在那里使用。对于Delphi 2007及更早版本(ANSI版本),您需要直接从\\?\C:\Folder\Folder\*致电FindFirstFile/FindNextFile/FindClose。有关更多信息,请查看平台SDK的Naming a file部分。

请注意,使用Windows.pas会禁用各种路径处理,因此请确保它是一个没有任何“。”的完全限定路径。或'..'条目。您可以使用相同的技巧打开文件流,重命名或复制具有较长路径的文件。

shell(Explorer)不支持此功能,因此您仍需要将这些限制为最多MA​​X_PATH字符,例如\\?\(删除到回收站)或SHFileOperation。在许多情况下,您可以通过传入DOS 8.3名称而不是长名称来解决问题。 FindFirst的TSearchRec不公开短名称,但FindFirstFile的ShellExecute结构的公式为TWin32FindData

答案 1 :(得分:0)

将当前目录(ChDir)更改为您知道的最深层目录,然后将相对路径传递给FindFirstFindFirstFile

该文件名中没有路径组件长于MAX_PATH字符,因此您应该能够一步一步地进入目录。

请注意,多线程程序可能对当前目录中的更改敏感,因为进程只有一个当前目录由所有线程共享。