.net 从目录中获取字节数组

ff29svar  于 2023-04-22  发布在  .NET
关注(0)|答案(2)|浏览(177)

我正在制作一个小工具来获取文件或目录的哈希值以查看校验和。现在我让它显示单个文件的哈希值,但当我尝试获取整个目录时,我得到错误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" />添加到应用程序清单。

wn9m85ua

wn9m85ua1#

根据ReadAllBytes的文档,第一个参数是:
path. String 要打开阅读的文件。
所以你必须提供一个 * 文件的路径,而不是其他任何东西的路径。目录当然不是一个文件,所以它不会起作用。
我不知道你所说的“目录散列”是什么意思,但在我看来,你可能必须打开单个文件(以确定的顺序),连接它们的字节,然后在整个事情上运行散列算法,即生成一个包含整个文件集的虚拟字节流。

var virtualByteStream = Directory
    .GetFiles(path)
    .OrderBy( p => p )
    .SelectMany
    (
        p => p.ReadAllbytes()
    );
var hash = md5Hash.ComputeHash(virtualByteStream.ToArray());

请注意,这种方法不包括文件元数据(例如DateModified),因此如果这对您很重要,那么您需要在哈希输入中包括它和任何其他元数据。
(If如果你的文件很大,你可能想找到一种方法来避免ToArray()调用,而使用ComputeHash(Stream)。但是这超出了这个答案的范围。)

iugsix8n

iugsix8n2#

在读取内容之前,您需要获取目录中的所有文件,如下所示:

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());        
        }

相关问题