파일 이름 앞에 \\?\
을 붙이면 확장 길이 경로 구문 분석을 사용하도록 설정하여 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
에 전화 할 때는 \\?\
접두어 만 사용해야합니다. 당신이 FindFirstFileW
의 lpFileName
매개 변수에 대한 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 파싱을 얻는 것입니다. 다른 모든 것은 아주 정상적으로 흐릅니다.
이것은 [Delphi - 파일이 255자를 넘는 경로가 있는지 확인하는 방법] (http://stackoverflow.com/q/16874118/62576)의 복제본입니다. 단, 속성 대신 'FileExists'에 대해 묻는 것을 제외하고는 . 기본 질문과 답변은 동일합니다. –
@KenWhite이 질문은 실제로 특성에 관한 것이 아닙니다. 그것들은'WIN32_FIND_DATAW' 구조체로부터 잘 읽혀집니다. 문제는 전적으로 260 문자 한도에서 벗어나야하는'FindFirstFile'에 대한 호출입니다. –
@David : '이름 지정 파일'링크 및 A/W 버전 언급을 포함하여 이전 질문에 대한 답으로 모두 다룹니다. 어떤 점에서 이것이 다른가요? –