2012-03-06 2 views
3

디렉토리 트리에있는 파일을 열거하기 위해 .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의 몇 가지 변경 사항을 살펴 보았습니다. 이전 프레임 워크에서 시도하지 않았습니다.

내 질문 :이 예외의 전체 경로를 얻을 수있는 방법

  1. ; 그것은 유익한 정보없이 겉으로 드러나지 않게 보인다.
  2. 왜 프레임 워크에서 파일 이름을 잘라낼 경로의 문자를 제한해야합니까? 사전에 어떤 도움

감사합니다,
앤디

답변

6
내가 사용하는 라이브러리 또는 P/호출을 반사를 사용하거나 사용하는 것보다 다른 내 머리 위로 떨어져 다른 방법을 생각할 수 없다

긴 경로를 지원하고 수동으로 길이를 검사하는 Windows API 그냥 파일 길이를 확인 실제로 파일과 함께 뭔가를 할 하려고하고있는 경우 전체 경로가 protected string 필드에 저장됩니다, 나는이 일 from the BCL team at Microsoft 같은 라이브러리를 사용하는 것이 좋습니다 것, FullPath

foreach(var dir in new DirectoryInfo (@"D:\longpaths") 
        .GetFileSystemInfos("*.*", SearchOption.AllDirectories)) 
{ 
    try 
    { 
     Console.WriteLine(dir.FullName); 
    } 
    catch (PathTooLongException) 
    { 
       FieldInfo fld = typeof(FileSystemInfo).GetField(
             "FullPath", 
             BindingFlags.Instance | 
             BindingFlags.NonPublic); 
       Console.WriteLine(fld.GetValue(dir)); // outputs your long path 
    } 
} 

라고 그러나 DirectoryInfos, FileInfo 또는 FileSystemInfo 문자열 만 생성하지는 않습니다. 그래서 그것은 당신의 코드 대신 드랍 - 인 대체물이 아닐 수도 있습니다.

두 번째 질문에 대한 대답은 this blog post에서 .NET의 긴 경로를 처리하는 것이 좋습니다. 이것은 .NET에서 긴 경로 지원을 빠르게 추가하지 않은 이유를 설명하는 견적입니다.

매우 적은 사람들이 32K 한도에 대해 불만을 토로하기 때문에 문제가 해결 되었습니까? 좀 빠지는. 과거에 긴 경로를 추가하기를 꺼려하는 이유가 몇 가지 있으며, 보안, Windows API의 일관성없는 지원 및 응용 프로그램 호환성과 관련하여 여전히주의해야합니다.

3 부작으로 구성된이 시리즈는 API가 왜 그런지, 왜 제한이 존재하는지에 대한 몇 가지 이유를 설명합니다.

+0

감사합니다 크리스토퍼, 나는 이것이 두려워했다. 비공개로 경로를 유지하고 처음에는 유효성을 검사하지 않고 액세스를 허용하지 않는 것은 바보처럼 보인다. 비록 나를 위해 올바르지 않은 경로를 만들었지 만. 당신이 지적한'LongPath' 라이브러리는 훌륭하게 보입니다! 불행히도 모든 경로가 UNC가 될 것이라고 언급하는 것을 잊어 버렸기 때문에 (아직) 그대로 사용할 수 없습니다.직접 API를 구현하는 방법을 보려면 코드를 살펴 보는 것이 매우 유용 할 것입니다. – Andyrooger

+0

@ 앤디 로거, 예, 잊어 버렸습니다. 코드를 포크하고 잠시 후 추가했습니다. Codeplex 프로젝트에서 코드를 얻을 수 있습니다 (http://longpaths.codeplex.com/). 릴리스가 아닌 소스 코드를 사용하여 바보 버그를 수정했습니다. –

+0

@ChristopherCurrens +1 FieldInfo 팁! –

관련 문제