如何为整个USB驱动器制作校验和?

问题描述 投票:2回答:1

我需要为整个USB驱动器创建校验和。我希望能够在我将文件放入其中时获得整个USB驱动器的校验和,然后能够在以后获得另一个校验和以检查是否有任何更改(病毒,文件更新等)。

现在,我找到所有单个文件的校验和,将它们放入StringBuilder,然后在放置所有校验和后获得StringBuilder的校验和。

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

我遇到了“System Volume Information”文件夹的问题,这导致了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;
}
c# usb checksum
1个回答
0
投票

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

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

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

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

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.
}

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

private string ChecksumFolder(string path, out List<string> inaccessibleFiles)
{
    inaccessibleFiles = null;

    FindFiles(path, "*", true, out List<string> accessible, out List<string> inaccessible);
    inaccessibleFiles = inaccessible;

    StringBuilder allChecksum = new StringBuilder();

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

    return CreateChecksumFromString(allChecksum.ToString());
}

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

© www.soinside.com 2019 - 2024. All rights reserved.