C#SHA256对文件路径很长的文件

时间:2012-08-28 20:24:42

标签: c# windows filepath sha256

我通过List<string>通过win32 api(kernel32的DllImport)通过递归获得FileFinderEx个文件。 (有几个问题可以解决这个问题)。

我使用MAX_PATH\\?\UNC\处理大于\\?\的完全限定路径。

另外,从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名称大于File.OpenRead,我MAX_PATH总是抛出异常(260我相信)

所以...现在怎么样?是否有一些win32 api函数我可以导入来执行读取而不是File.OpenRead?或者是否有其他.NET方法来打开具有长文件路径的文件?有什么提示可以解决这个限制吗?

1 个答案:

答案 0 :(得分:2)

查看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部分here),涵盖了Windows和.NET中的长路径主题,我认为你会发现它很有用。

相关问题