C# 从目录中获取字节数组

C# 从目录中获取字节数组,c#,.net,hash,C#,.net,Hash,我正在制作一个小工具来获取文件或目录的哈希值以查看校验和。现在,我让它显示单个文件的哈希值,但当我尝试获取整个目录时,会出现错误System.UnauthorizedAccessException:“对路径“D:\dev\hashcheck”的访问被拒绝。” 这里是代码的简化版本,简化只是因为它非常重复 byte[] fileByte = File.ReadAllBytes(path); //This is where the error is MD5 md5Hash = MD5.Create(

我正在制作一个小工具来获取文件或目录的哈希值以查看校验和。现在,我让它显示单个文件的哈希值,但当我尝试获取整个目录时,会出现错误
System.UnauthorizedAccessException:“对路径“D:\dev\hashcheck”的访问被拒绝。”

这里是代码的简化版本,简化只是因为它非常重复

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

我已尝试将
添加到应用程序清单中。

您需要先获取目录中的所有文件,然后才能读取内容,如下所示:

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

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

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());        
        }
根据,第一个参数是:

路径。字符串要打开以进行读取的文件

因此,您必须提供文件的路径,而不是任何其他文件的路径。当然,目录不是文件,所以它不起作用

我不知道你所说的“目录哈希”是什么意思,但在我看来,你可能必须打开各个文件(以确定的顺序),连接它们的字节,然后在整个过程中运行哈希算法,即生成包含整个文件集的虚拟字节流

var virtualByteStream = Directory
    .GetFiles(path)
    .OrderBy( p => p )
    .SelectMany
    (
        p => p.ReadAllbytes()
    );
var hash = md5Hash.ComputeHash(virtualByteStream.ToArray());
请注意,这种方法不包括文件元数据(例如DateModified),因此如果这对您很重要,那么您需要在哈希输入中包括它和任何其他元数据

(如果您的文件很大,您可能希望找到一种方法来避免调用ToArray()并改用。但这超出了此答案的范围。)

根据,第一个参数是:

路径。字符串要打开以进行读取的文件

因此,您必须提供文件的路径,而不是任何其他文件的路径。当然,目录不是文件,所以它不起作用

我不知道你所说的“目录哈希”是什么意思,但在我看来,你可能必须打开各个文件(以确定的顺序),连接它们的字节,然后在整个过程中运行哈希算法,即生成包含整个文件集的虚拟字节流

var virtualByteStream = Directory
    .GetFiles(path)
    .OrderBy( p => p )
    .SelectMany
    (
        p => p.ReadAllbytes()
    );
var hash = md5Hash.ComputeHash(virtualByteStream.ToArray());
请注意,这种方法不包括文件元数据(例如DateModified),因此如果这对您很重要,那么您需要在哈希输入中包括它和任何其他元数据


(如果您的文件很大,您可能希望找到一种方法来避免调用并使用
ToArray()
。但这超出了本答案的范围。)

您可能正在寻找从目录中获取所有文件,然后获取单个文件的哈希值。.看这篇文章您可能正在寻找从目录中获取所有文件,然后获取单个文件的哈希值。.看这篇文章