2013-06-03 2 views
6

델파이 : 255 자 이상의 경로를 되풀이하고 파일 속성을 읽는 방법경로를 255 자 이상으로 재귀하고 파일 속성을 읽는 방법은 무엇입니까?

나는 콘솔 응용 프로그램을 작성하고 경로가 255자를 훨씬 넘는 디렉토리 구조를 탐색 한 다음 그 안에있는 파일의 속성을 읽어야합니다.

역사적으로 필자는 2006 년부터 Turbo Delphi를 사용하여 재귀 및 FindFirst를 사용했지만 255자를 넘는 경로는 건너 뛴 것으로 보입니다.

FindFirst() 함수를 다른 것으로 바꿀 수 있습니까? 아니면 다른 접근 방식을 취해야합니까?

+1

이것은 [Delphi - 파일이 255자를 넘는 경로가 있는지 확인하는 방법] (http://stackoverflow.com/q/16874118/62576)의 복제본입니다. 단, 속성 대신 'FileExists'에 대해 묻는 것을 제외하고는 . 기본 질문과 답변은 동일합니다. –

+0

@KenWhite이 질문은 실제로 특성에 관한 것이 아닙니다. 그것들은'WIN32_FIND_DATAW' 구조체로부터 잘 읽혀집니다. 문제는 전적으로 260 문자 한도에서 벗어나야하는'FindFirstFile'에 대한 호출입니다. –

+1

@David : '이름 지정 파일'링크 및 A/W 버전 언급을 포함하여 이전 질문에 대한 답으로 모두 다룹니다. 어떤 점에서 이것이 다른가요? –

답변

8

파일 이름 앞에 \\?\을 붙이면 확장 길이 경로 구문 분석을 사용하도록 설정하여 260 문자 길이의 문자를 이스케이프 처리합니다.

이 접두사가 작동하려면 유니 코드 버전의 Win32 API 함수를 호출해야합니다. 그래서 유니 코드 델파이를 사용했다면 이것 만 있으면됩니다. 하지만 Unicode 이전 버전의 Delphi를 사용하고 있으므로 API 함수의 유니 코드 버전을 호출하는 FindFirst 버전을 롤업해야합니다. FindFirstFileW, FindNextFileW, FindClose을 호출하고 유니 코드 버전의 구조체 WIN32_FIND_DATAW을 사용합니다.

이러한 문제는 MSDN의 Naming Files, Paths, and Namespaces에서 논의되었습니다. 특정 시나리오에서

FindFirstFileW에 대한 설명서는 다음과 같이 문제를 호출이 함수의 ANSI 버전에서

는, 이름이 MAX_PATH 문자로 제한됩니다. 이 제한을 32,767 와이드 문자로 확장하려면 함수의 유니 코드 버전을 호출하고 "\? \"를 앞에 추가하십시오.

WIN32_FIND_DATAW의 두 파일 이름 필드의 길이는 260 자로 제한됩니다. 이름의 상대적 부분, 즉 포함하는 디렉토리에 상대적인 객체 이름 만 포함되어 있기 때문에 괜찮습니다. FindFirstFileW에 전화 할 때는 \\?\ 접두어 만 사용해야합니다. 당신이 FindFirstFileWlpFileName 매개 변수에 대한 WideString을 사용하고 PWideChar(FileName)를 사용하여 정보를 전달하겠습니다이 API의 유니 코드 버전을 사용하기 위해서는

. 파일 특성에 관해서는

var 
    FileName: WideString; 
.... 
// initialise FileName, this will happen in your recursion 
FindHandle := FindFirstFileW(PWideChar(FileName), FindData); 

은, 그들은 각 반복에 WIN32_FIND_DATAW 구조체의 판독 할 수있다. 코드의 해당 부분을 변경할 필요는 없습니다. 해결해야 할 유일한 것은 FindFirstFileW에 대한 초기 호출에서> 260 char 파싱을 얻는 것입니다. 다른 모든 것은 아주 정상적으로 흐릅니다.

+0

필자가 읽었을 때 유니 코드 기능을 중심으로 이전 버전의 Delphi 용 함수를 래핑하거나 새로운 "유니 코드"버전을 사용하는 문제입니다. 내가 후자를하고 그냥 재 컴파일하면 그 일이 가능 할까? – Tal

+0

유니 코드 델파이로 다시 컴파일하고 마술 접두어를 추가하면 원하는 결과를 얻을 수 있습니다. 'FindFirst'가'Path' 매개 변수를'FindFirstFile'에 넘기고 유니 코드 델파이로 유니 코드 버전을 얻었 기 때문입니다. –

관련 문제