【发布时间】:2019-02-11 23:54:02
【问题描述】:
我需要为整个 USB 驱动器创建校验和。我希望能够在我将文件放入 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());
}
我遇到了“系统卷信息”文件夹的问题,这导致Directory.GetFiles() 行出现异常。文件的校验和和StringBuilder 在用于其他文件夹时工作得很好。
您是否知道为整个 USB 创建校验和的另一种方法或以编程方式进入该系统卷信息文件夹的方法?
提前致谢!
编辑:添加 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;
}
【问题讨论】:
-
有什么例外?
CreateChecksumFromString()和CreateChecksumFromFile()方法是什么样的?另外,一个相关提示,使用EnumerateFiles()而不是GetFiles(),因为它更快。 -
这是一个 UnauthorizedAccessException,带有消息“访问路径 'E:\System Volume Information' 被拒绝。”此外,该程序请求管理权限
-
你可以用谷歌搜索那个特殊的“系统卷信息”文件夹是什么。我不知道哈希/校验和值的用途是什么,但我倾向于建议从校验和计算中排除此类特定于系统的文件夹。
-
好的,这很容易解释 - 您正在尝试访问您无权访问的文件。
-
我猜这行会抛出异常?
using (FileStream stream = File.OpenRead(file))我会避免那些无法访问的文件并计算其余文件的校验和。