2010-08-11 48 views
7

有一些文件夾上有超過100個文件。 但所有文件和文件夾名稱都使用錯誤的編碼名稱(UTF-> ANSI)打亂。查找long(> 255)文件名

"C:\...\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\вертолетка\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\вертолетка\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\вертолетка\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\вертолетка\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\вертолетка\Р「осдача-Лечебни РєРѕСЂРїСѓСЃ\..." 

常規功能Utf8ToAnsi finxing,但FindFirst不能超過225個字符,名稱搜索文件夾。

它給了我只有70/100個文件。

回答

13

FindFirst包裝Win32 API函數FindFirstFile,如果您將\\?\添加到傳入的路徑中,則該函數的Unicode版本可以搜索長達32,767個字符的路徑,例如\\?\C:\Folder\Folder\*

由於Delphi 2009和更新版本爲您調用Unicode函數,因此您可以使用FindFirst和co。對於德爾福2007和更早版本(ANSI版本),您需要直接撥打Windows.pas致電FindFirstFile/FindNextFile/FindClose。有關更多信息,請查看平臺SDK的Naming a file部分。

請注意,使用\\?\會禁用各種路徑處理位,所以請確保它是完全合格的路徑,不含'。'。或'..'條目。您可以使用相同的技巧打開文件流,重命名或複製具有更長路徑的文件。

雖然shell(資源管理器)不支持這個功能,但您仍然需要將這些限制爲最多MA​​X_PATH個字符,例如SHFileOperation(要刪除回收站)或ShellExecute。在許多情況下,您可以通過傳入DOS 8.3名稱而不是長名稱來解決此問題。 FindFirst的TSearchRec不公開短名稱,但FindFirstFile的TWin32FindData結構的作用是cAlternateFileName

0

改變當前目錄(ChDir)你知道,和最深的一個,然後通過一個相對路徑FindFirstFindFirstFile

該文件名中沒有路徑組件長於MAX_PATH字符,因此您應該能夠一步一步地進入目錄。

請注意,多線程程序可能對當前目錄中的更改敏感,因爲進程只有一個當前目錄由所有線程共享。