有一些文件夹上有超过100个文件。 但所有文件和文件夹名称都以错误的编码名称(UTF-> ANSI)打破。
"C:\...\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\..."
常规功能Utf8ToAnsi
完成它,但FindFirst
无法搜索名称长度超过255个符号的文件夹。
它只给我70/100个文件。
答案 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)不支持此功能,因此您仍需要将这些限制为最多MAX_PATH字符,例如\\?\
(删除到回收站)或SHFileOperation
。在许多情况下,您可以通过传入DOS 8.3名称而不是长名称来解决问题。 FindFirst的TSearchRec不公开短名称,但FindFirstFile的ShellExecute
结构的公式为TWin32FindData
。
答案 1 :(得分:0)
将当前目录(ChDir
)更改为您知道的最深层目录,然后将相对路径传递给FindFirst
或FindFirstFile
。
该文件名中没有路径组件长于MAX_PATH字符,因此您应该能够一步一步地进入目录。
请注意,多线程程序可能对当前目录中的更改敏感,因为进程只有一个当前目录由所有线程共享。