2009-08-31 4 views

답변

8

쉽게 알 수있는 것은 아닙니다. 피닉스 (Phoenix)가 언급했듯이 스트림에 대한 해결 방법을 사용할 수는 있지만 파일 이름을 처리 할 수는 없습니다. 파일 이름과 함께 작동하는 모든 클래스는 내부적으로 긴 파일 이름 검사를 수행합니다.

리플렉션을 사용하여 FileInfo를 인스턴스화하고 비공개 멤버를 채울 수 있지만 (권장하지 않음) 긴 경로를 가진 파일을 가리키는 FileInfo를 가져옵니다. 그러나이 객체를 사용하려고하면 PathTooLongException 예외가 계속 발생합니다. 예를 들어 Path 클래스 (FileInfo에서 많이 사용)는 모든 메소드 호출에서 긴 경로를 확인하기 때문입니다.

따라서 문제없는 긴 경로 지원을 얻는 올바른 방법은 하나뿐입니다. FileInfo 동작을 모방 한 클래스 세트를 구현하십시오. 그것은 매우 복잡하지는 않지만 (단지 보안 일 수도 있음), 시간 소모적입니다.

업데이트 : 여기에 심지어이 준비 솔루션이 문제에 대한 : AlpfaFS과 여기에 직장에서

+0

1을; Zeta Long Path 링크를 통해 내가 필요한 것을 정확히 얻을 수있었습니다. 'FindFirstFile' API 호출은'FileInfo'를 복제하는 핵심 요소입니다. –

+0

AlphaFS가 나에게 트릭을 보냈습니다. 덕분에 – bjoern

7

우리는 매우 자주 긴 경로를 처리, 우리는 따라서 기본적으로 그것을 할 우리 자신의 System.IO를 출시했다 Zeta Long Paths . 글쎄,하지만 우리는 File, Directory, FileInfo, DirectoryInfo 및 Path를 약간만 재 작성했습니다. 기본 전제는 Win32 API 관점에서 가능하다는 것입니다. 따라서 하루가 끝나면 실제로해야 할 일은 유니 코드 버전의 Win32 API 함수를 호출하는 것입니다. 그렇다면 여러분은 훌륭합니다. 그것은 일의 alot이고, 엉덩이에 때때로 고통 일 수있다, 그러나 진짜로 그것을하는 더 나은 방법이 없다.

+0

새로운 클래스가 어떻게 보이나요, 그것들은 100 % 손으로 작성되었거나 File 클래스에서 내장 된 File 클래스를 서브 클래스 화합니까? –

+3

글쎄, 파일은 실제로 정적 클래스이므로 상속받을 수는 없지만 하위 클래스 화 (FileInfo, DirectoryInfo) 클래스의 대부분은 봉인되어 서브 클래 싱 할 수 없습니다. 우리는 그들을 처음부터 모두 썼습니다. 나는 거짓말하지 않을 것이다, 우리는 반사체를 사용했다. :) – BFree

+0

Doh, yeah, static :) 꽤 멋지고 훌륭한 대답. –

0

가,이 Delimon.Win32.I​O Library (V4.0) 을 불리는 긴 파일 이름 문제를 극복하기위한 마이크로 소프트 TechNet의 큰 라이브러리 그리고 그것은 예를 들어, 당신은 대체 할 System.IO

에서 주요 방법 중 자신의 버전이 있습니다 :

Delimon.Win32.IO.Directory.GetFiles 

System.IO.Directory.GetFiles 

당신이 시간을 할 것이다 andle 긴 파일 및 폴더. 웹 사이트에서

:

Delimon.Win32.IO 최대 32,767 자까지 & 폴더 이름을 파일 System.IO 및 지원의 기본 파일 기능을 대체합니다.

이 라이브러리는 .NET 프레임 워크 4.0에 기록되고 86 & x64 시스템에 하나 사용할 수 있습니다. 표준 System.IO 네임 스페이스의 파일 & 폴더 제한 (MAX_PATH는 일반적으로 260 개 문자로 구성 입니다) 폴더 이름에 파일 이름에 260 자 240 자까지 파일로 작업 할 수 있습니다.일반적으로 System.IO.PathTooLongException 표준 .NET 라이브러리에 오류가 발생합니다.

1

FullName 속성 만 사용해야했지만 PathTooLongException도 수신했습니다. FullPath는 값을 추출하는 반사를 사용

내 문제 해결에 충분했다 :

private static string GetFullPath(FileInfo src) 
{ 
    return (string)src.GetType() 
     .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic) 
     .GetValue(src); 
} 
관련 문제