0

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

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

此外,从 win32 api 我可以通过GetShortPathNameW.

现在我有了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 名称),File.OpenRead如果完全限定的 UNC 名称大于MAX_PATH(我相信是 260),总是会抛出异常。

那么现在怎么办?我可以导入一些win32 api函数来代替阅读File.OpenRead吗?或者是否有其他一些 .NET 方法来打开具有长文件路径的文件?有什么技巧可以绕过这个限制吗?

4

1 回答 1

2

看一下CreateFilekernel32.dll 中的函数。尽管它的名字,你可以使用它来读取或创建一个文件,并且 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 中的长路径主题,我认为您会发现这些文章很有用。

于 2012-08-28T20:57:45.993 回答