디렉토리 트리에있는 파일을 열거하기 위해 .Net 4.0에서 DirectoryInfo 및 FileInfo를 사용하고 있으며 PathTooLongException이 발생합니다. 오류가 발생했을 때, 나는이 문제의 원인을 파일 경로를 알고 싶어 PathTooLongException에서 경로 정보를 검색하십시오.
public static class Test
{
public static void Search(DirectoryInfo base)
{
foreach(var file in base.GetFiles())
{
try
{
Console.WriteLine(file.FullName);
} catch(PathTooLongException ex)
{
// What path was this?
}
}
foreach(var dir in base.GetDirectories())
{
Search(dir);
}
}
}
아래 간체 버전입니다. 분명히 그것은 무엇이 오류인지에 따라
FullName
을 요청할 수 없습니다.
file.Name
에서 이름을 얻을 수 있지만,
file.Directory
이 경로의 나머지 부분을 가져올 수없는 경우
PathTooLongException
이 제공됩니다.
DirectoryInfo
파일이 정상적으로 발견되었지만! (실제 코드가 훨씬 더 복잡하기 때문에 사용할 수는 없습니다.)
스택 추적을 살펴보면 내부 경로 (디버그로부터 보호 된 file.FullPath
이 표시됨)를 사용하고 있고 전체 경로에서 디렉토리를 찢어 버리려고하는 것으로 보입니다. 대부분의 문제는 System.IO.Path.NormalizePath
과 관련이 있으며, .NET 4.0의 몇 가지 변경 사항을 살펴 보았습니다. 이전 프레임 워크에서 시도하지 않았습니다.
내 질문 :이 예외의 전체 경로를 얻을 수있는 방법
- ; 그것은 유익한 정보없이 겉으로 드러나지 않게 보인다.
- 왜 프레임 워크에서 파일 이름을 잘라낼 경로의 문자를 제한해야합니까? 사전에 어떤 도움
감사합니다,
앤디
감사합니다 크리스토퍼, 나는 이것이 두려워했다. 비공개로 경로를 유지하고 처음에는 유효성을 검사하지 않고 액세스를 허용하지 않는 것은 바보처럼 보인다. 비록 나를 위해 올바르지 않은 경로를 만들었지 만. 당신이 지적한'LongPath' 라이브러리는 훌륭하게 보입니다! 불행히도 모든 경로가 UNC가 될 것이라고 언급하는 것을 잊어 버렸기 때문에 (아직) 그대로 사용할 수 없습니다.직접 API를 구현하는 방법을 보려면 코드를 살펴 보는 것이 매우 유용 할 것입니다. – Andyrooger
@ 앤디 로거, 예, 잊어 버렸습니다. 코드를 포크하고 잠시 후 추가했습니다. Codeplex 프로젝트에서 코드를 얻을 수 있습니다 (http://longpaths.codeplex.com/). 릴리스가 아닌 소스 코드를 사용하여 바보 버그를 수정했습니다. –
@ChristopherCurrens +1 FieldInfo 팁! –