2012-08-28 2 views
0

win32 api (DllImport of kernel32)를 통해 FileFinderEx을 통해 재귀를 통해 파일 List<string>을 얻습니다. 이것이 어떻게 수행되는지에 대한 몇 가지 질문이 있습니다.매우 긴 파일 경로를 가진 파일의 경우 C# SHA256

\\?\UNC\\\?\을 사용하여 MAX_PATH보다 큰 정규화 된 경로를 처리합니다.

또한 win32 api에서 GetShortPathNameW을 통해 파일의 "짧은 경로"(8.3 이름)를 가져올 수 있습니다.

파일에 대한 정규화 된 경로가 List<string>이므로 각 경로를 반복하고 SHA256을 다른 목록 (동일한 색인)에 배치하려고합니다. 그래서 대략 이런 식으로 뭔가 :

List<string> files = new List<string>(); 
//win api function populates files ... 
List<string> hash = new List<string>(); 
for (int i = 0; i < files.Count; i++) 
{ 
    using (var stream = new BufferedStream(File.OpenRead(files[i]), 1200000)) 
    { 
     SHA256Managed sha = new SHA256Managed(); 
     byte[] checksum = sha.ComputeHash(stream); 
     hash.Add(BitConverter.ToString(checksum).Replace("-", String.Empty)); 
     stream.Close(); 
    } 
} 

내가 직면 문제 내가 완전한 UNC 이름을 MAX_PATH보다 큰 경우는 "짧은 경로"(8.3 명)에 File.OpenRead 항상 예외가 발생합니다 줄 경우에도 ((260) 나는 믿는다).

그래서 ... 지금은 무엇입니까? File.OpenRead 대신에 읽을 수있는 몇 가지 win32 API 함수가 있습니까? 아니면 긴 파일 경로로 파일을 여는 다른 .NET 메서드가 있습니까? 이 제한을 극복하는 데 도움이되는 팁이 있습니까?

답변

2

kernel32.dll의 CreateFile 함수를 살펴보십시오. 그 이름에도 불구하고 파일을 읽거나 만들 때 사용할 수 있으며 유니 코드 버전에서는 MAX_PATH보다 긴 경로를 사용할 수 있습니다.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] 
internal static extern SafeFileHandle CreateFile(
    string lpFileName, 
    EFileAccess dwDesiredAccess, 
    EFileShare dwShareMode, 
    IntPtr lpSecurityAttributes, 
    ECreationDisposition dwCreationDisposition, 
    EFileAttributes dwFlagsAndAttributes, 
    IntPtr hTemplateFile); 

다시 난 당신이 유용 할 거라고 생각 윈도우 및 .NET 긴 경로의 주제를 다루는 몇 년에서 BCL 팀의 블로그에 게시물의 좋은 시리즈 (1 부 here가) 있습니다.

+0

감사합니다. 오해의 소지가있는 이름으로 인해 이전에 이것을 찾지 않았습니다! – user17753

관련 문제