繁体   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