查找长(> 255)个文件名

And*_*umm 7 delphi filenames find long-integer

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

"C:\...\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\???µ???‚???»?µ?‚???°\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\???µ???‚???»?µ?‚???°\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\???µ???‚???»?µ?‚???°\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\???µ???‚???»?µ?‚???°\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\???µ???‚???»?µ?‚???°\?“???????°?‡?°-?›?µ?‡?µ?±???? ????????????\..."
Run Code Online (Sandbox Code Playgroud)

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

它只给我70/100文件.

Zoë*_*son 13

FindFirst包装了Win32 API函数FindFirstFile,如果你预先添加\\?\到你传入的路径,那么该函数的Unicode版本可以搜索长达32,767个字符的路径\\?\C:\Folder\Folder\*.

自从Delphi 2009及更新版本为您调用Unicode函数以来,您可以使用FindFirst并在那里合作.对于德尔福2007年和早期(ANSI版本),你需要调用FindFirstFile/FindNextFile/FindCloseWindows.pas直接.有关更多信息,请查看平台SDK 的命名文件部分.

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

shell(资源管理器)不支持这一点,因此您仍然需要将这些限制为最多MA​​X_PATH字符(例如SHFileOperation删除到回收站)或ShellExecute.在许多情况下,您可以通过传入DOS 8.3名称而不是长名称来解决问题.FindFirst的TSearchRec不公开短名称,但FindFirstFile的TWin32FindData结构也是如此cAlternateFileName.