[英]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.