C# 在不打开文件的情况下生成校验和

C# 在不打开文件的情况下生成校验和,c#,cryptography,C#,Cryptography,有没有办法计算只读文件的校验和 我见过的唯一的例子使用这样的算法 public string GetChecksum() { FileStream file = new FileStream(_filePath, FileMode.Open); MD5 md5 = new MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuild

有没有办法计算只读文件的校验和

我见过的唯一的例子使用这样的算法

public string GetChecksum()
{
    FileStream file = new FileStream(_filePath, FileMode.Open);
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] retVal = md5.ComputeHash(file);
    file.Close();

    StringBuilder sb = new StringBuilder();
    foreach (byte t in retVal)
    {
        sb.Append(retVal[1].ToString("x2"));
    }
    return sb.ToString();
}

即使文件是只读的,也可以打开它。
不打开文件就无法生成校验和,因为不打开文件就无法读取文件

您应该通过
FileAccess.Read
以只读方式打开它


此外,应该使用SHA512而不是MD5生成校验和。

如果不读取整个文件,则无法生成校验和

通常,可以打开只读文件。可能存在阻止给定用户打开文件的文件或文件夹权限。

根据,您正在使用的FileStream构造函数将打开文件进行读/写操作。使用指定FileAccess.Read的重载

构造函数被赋予读/写权限 访问该文件,并将其打开 共享读访问


不,你必须读一个文件才能对里面的东西做任何事情。但是当您可能想要
FileStream(_filePath,FileAccess.Read,true,4096,true)时,您使用的是通用访问
以只读方式打开它。StreamReader将自动执行此操作。

Readonly并不意味着您无法打开它。不确定问题是什么?呃。。。由于只需读取文件即可计算校验和只读,这正是您想要的。具体而言,构造函数调用应该是
newfilestream(\u filePath,FileMode.Open,FileAccess.read)
。请参见这里的一个示例,说明为什么MD5不适用于文件校验和:他还应该在该文件流上使用
using
子句,考虑使用“代码>文件.OpenRead())/Cux>方法显式,而不是<代码>新FielestRAME()/<代码>构造函数。