2010-08-11 6 views
7

100 개가 넘는 파일이있는 폴더가 있습니다. 그러나 모든 파일 및 폴더 이름이 잘못된 인코딩 이름 (UTF-> ANSI)으로 손상되었습니다. 그것을 finxing하지만 FindFirst 255 개 문자보다 긴 이름을 가진 폴더를 검색 할 수 없습니다길 찾기 (> 255) 파일 이름

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

정기적 인 기능 Utf8ToAnsi.

나는 70/100 파일 만 검색합니다. 당신이 알고, 가장 깊은 일에

답변

13

는 FindFirst에는 Win32 API 함수 FindFirstFile를 래핑, 당신은 당신이 \\?\C:\Folder\Folder\*처럼에 전달하는 경로를 \\?\을 붙일 경우 그 함수의 유니 코드 버전은 긴 32,767 자까지 경로를 검색 할 수 있습니다.

Delphi 2009 및 이후 새로운 유니 코드 함수를 호출하기 때문에 FindFirst와 함께 사용할 수 있습니다. Delphi 2007 및 이전 버전 (ANSI 버전)의 경우 FindFirstFile/FindNextFile/FindCloseWindows.pas으로 직접 전화해야합니다. 자세한 내용은 플랫폼 SDK의 Naming a file 섹션을 확인하십시오.

\\?\을 사용하면 경로 처리의 다양한 비트가 비활성화되므로, ''없이 완전한 경로인지 확인하십시오. 또는 '..'항목. 동일한 트릭을 사용하여 파일 스트림을 열거 나 이름이 바뀌거나 긴 경로로 파일을 복사 할 수 있습니다.

셸 (탐색기)은이 기능을 지원하지 않으므로 SHFileOperation (휴지통으로 삭제) 또는 ShellExecute 등의 경우 최대 MAX_PATH 자로 제한해야합니다. 대부분의 경우 긴 문제 대신 DOS 8.3 이름을 전달하여 문제를 해결할 수 있습니다. FindFirst의 TSearchRec는 짧은 이름을 표시하지 않지만 FindFirstFile의 TWin32FindData 구조는 cAlternateFileName과 같습니다.

0

변경 현재 디렉토리 (ChDir는) 다음 FindFirst 또는 FindFirstFile상대 경로를 전달합니다.

파일 이름에 경로 구성 요소가 없으므로 MAX_PATH 문자보다 길기 때문에 한 번에 한 단계 씩 디렉토리로 작업 할 수 있어야합니다.

프로세스에 모든 스레드가 공유하는 현재 디렉토리가 하나뿐이므로 다중 스레드 프로그램은 현재 디렉토리의 변경 사항에 민감 할 수 있습니다.