我通过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方法来打开具有长文件路径的文件?有什么提示可以解决这个限制吗?
答案 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中的长路径主题,我认为你会发现它很有用。