如何对整个USB驱动器进行校验和?

时间:2018-09-06 16:45:27

标签: c# usb checksum

我需要为整个USB驱动器创建一个校验和。我希望在将文件放到整个USB驱动器上时获取整个USB驱动器的校验和,然后在以后再获取另一个校验和以检查是否未更改(病毒,文件更新等)。

现在,我正在查找所有单个文件的校验和,将它们放入StringBuilder中,然后在所有校验和都放置好之后,再获取该StringBuilder的校验和。 / p>

private string ChecksumFolder(string path)
{
    string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);

    StringBuilder allChecksum = new StringBuilder();

    for (int count = 0; count < files.Length; count++)
    {
        allChecksum.Append(CreateChecksumFromFile(files[count]));
    }

    return CreateChecksumFromString(allChecksum.ToString());
}

我遇到“系统卷信息”文件夹的问题,这在Directory.GetFiles()行引起了异常。这些文件和StringBuilder的校验和在其他文件夹上使用时效果很好。

您是否知道为整个USB创建校验和的另一种方法,还是以编程方式进入该System Volume Information文件夹的方法?

谢谢!

编辑:添加CreateChecksumFromFile(String版本本质上是相同的,只是使用不同类型的流作为校验和)

private string CreateChecksumFromFile(string file)
{
    string mChecksum;
    using (FileStream stream = File.OpenRead(file))
    {
        SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
        byte[] checksum = sha.ComputeHash(stream);
        mChecksum = BitConverter.ToString(checksum).Replace("-", String.Empty);
        sha.Clear();
    }
    return mChecksum;
}

1 个答案:

答案 0 :(得分:0)

好的,所以您有两个部分的问题。

  1. 您要浏览目录中的所有文件并创建校验和。
  2. 可能有一些无法访问的文件,但您也希望将它们也包含在校验和中。

因此,我提出了一种解决方法。 -如果文件可访问,请为其创建校验和。 -如果没有,请将文件名添加到列表中。 -稍后,在验证完整性时,我们将同时验证校验和和不可访问的文件列表。

因此,假定以下方法使用example in this SO answer并创建可访问文件的列表。而且,此外,如果无法访问文件,则会将其添加到列表中。

{this.props.tooltip(this.iconInstance)}

现在让我们修改您的方法。

private static void FindFiles(string path, string file_pattern, bool recurse, out List<string> accessible, out List<string> inaccessible)
{
    accessible = new List<string>();
    inaccessible = new List<string>();
    // This creates two lists, one with accessible files and one with inaccessible files.
}

现在,通过使用所有可访问的文件以及不可访问的文件的列表,您对该文件夹具有校验和。您将两者保存,然后将它们发送到稍后将验证完整性的任何应用程序。然后,您匹配校验和,并查看无法访问的文件列表中的文件是否相同。