簡體   English   中英

C#SHA256對文件路徑很長的文件

[英]C# SHA256 on files with very long file paths

我通過FileFinderEx通過win32 api(kernel32的DllImport)通過遞歸獲得List<string>文件。 (有幾個問題可以解決這個問題)。

我使用\\\\?\\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();
    }
}

我面臨的問題是即使我給它“短路徑”(8.3名稱),如果完全限定的UNC名稱大於MAX_PATH (我相信260), File.OpenRead總是拋出異常。

那么現在怎么辦? 是否有一些win32 api函數我可以導入來執行讀取而不是File.OpenRead 或者是否有其他.NET方法來打開具有長文件路徑的文件? 有什么提示可以解決這個限制嗎?

看看kernel32.dll中的CreateFile函數。 盡管它的名稱,您可以使用它來讀取或創建文件,Unicode版本將允許您使用長於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);

幾年前BCL團隊的博客上有一系列很好的帖子( 這里的第1部分),涵蓋了Windows和.NET中的長路徑主題,我認為你會發現它很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM