我正在制作一个小工具来获取文件或目录的哈希值来查看校验和。现在我让它显示单个文件的哈希值,但当我尝试获取整个目录时,我得到错误System.UnauthorizedAccessException: 'Access to the path 'D:\dev\hashcheck' is denied.'
。
这是代码的简化版本,只是因为它非常重复而被简化。
byte[] fileByte = File.ReadAllBytes(path); //This is where the error is
MD5 md5Hash = MD5.Create();
Console.WriteLine("The MD5 Hash of the file is; " +
BitConverter.ToString(md5Hash.ComputeHash(fileByte))
.Replace("-", string.Empty)
.ToLower());
我尝试将<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
添加到应用程序清单中。
根据documentation for ReadAllBytes,第一个参数是:
路径。 String要打开以供阅读的文件。
因此,您必须提供文件的路径,而不是其他任何路径。目录当然不是文件,所以它不会起作用。
我不确定你的意思是什么“目录的哈希”,但在我看来,你可能必须打开单个文件(以确定的顺序),连接他们的字节,然后运行哈希算法整个事情,即生成包含整个文件集的虚拟字节流。
var virtualByteStream = Directory
.GetFiles(path)
.OrderBy( p => p )
.SelectMany
(
p => p.ReadAllbytes()
);
var hash = md5Hash.ComputeHash(virtualByteStream.ToArray());
请注意,此方法不包含文件元数据(例如DateModified),因此如果这对您很重要,那么您需要在哈希输入中包含它和任何其他元数据。
(如果你的文件很大,你可能想找到一种避免ToArray()
调用的方法,而是使用ComputeHash(Stream)
。但这超出了这个答案的范围。)
在阅读内容之前,您需要获取目录中的所有文件,如下所示:
using System.IO;
foreach (string file in Directory.GetFiles(path))
{
byte[] fileByte = File.ReadAllBytes(file);
MD5 md5Hash = MD5.Create();
Console.WriteLine("The MD5 Hash of the file is; " +
BitConverter.ToString(md5Hash.ComputeHash(fileByte))
.Replace("-", string.Empty)
.ToLower());
}