2010-08-11 16 views
7

Istnieje folder zawierający ponad 100 plików. Ale wszystkie nazwy plików i folderów są uszkodzone przy użyciu niewłaściwych nazw kodowania (UTF-> ANSI).Znajdź długie (> 255) nazwy plików

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

regularna funkcja Utf8ToAnsi finxing, ale FindFirst nie mogą przeszukiwać katalogi o nazwach dłuższych niż 255 znaków.

Dostarcza mi tylko 70/100 plików.

Odpowiedz

13

FindFirst owija funkcji API Win32 FindFirstFile, a wersja Unicode tej funkcji można szukać ścieżek górę do 32767 znaków jeśli przygotowałeś \\?\ do ścieżki jesteś przechodzącą w jak \\?\C:\Folder\Folder\*.

Od Delphi 2009 i nowszych funkcji wywołujących Unicode dla Ciebie, możesz po prostu użyć FindFirst i współpracy tam. W przypadku Delphi 2007 i wcześniejszych (wersje ANSI) należy bezpośrednio zadzwonić pod numer FindFirstFile/FindNextFile/FindClose z Windows.pas. Aby uzyskać więcej informacji, sprawdź sekcję zestawu SDK platformy.

Należy pamiętać, że użycie \\?\ powoduje wyłączenie różnych bitów przetwarzania ścieżki, więc upewnij się, że jest to pełna ścieżka bez żadnego "." lub wpisy "..". Możesz użyć tej samej sztuczki, aby otwierać strumienie plików, zmieniać nazwy lub kopiować pliki o dłuższych ścieżkach.

Powłoka (Explorer) nie obsługuje tego jednak, więc nadal musisz ograniczyć te do maksymalnie MAX_PATH znaków dla rzeczy takich jak SHFileOperation (aby usunąć do kosza) lub ShellExecute. W wielu przypadkach można obejść problem, przekazując nazwy DOS 8.3 zamiast długich. Program TSearchRec FindFirst nie ujawnia krótkich nazw, ale struktura FindFirstFile TWin32FindData ma jako cAlternateFileName.

0

Zmień bieżący katalog (ChDir) do najgłębszego jednego wiedzieć o, a następnie przekazać ścieżkę względną do FindFirst lub FindFirstFile.

Żaden element ścieżki w tej nazwie pliku nie jest dłuższy niż MAX_PATH, więc powinieneś być w stanie pracować w katalogach krok po kroku.

Należy pamiętać, że programy wielowątkowe mogą być wrażliwe na zmiany w bieżącym katalogu, ponieważ proces ma tylko jeden katalog bieżący współdzielony przez wszystkie wątki.