检查2个文件校验和,以检测它们之间的任何差异

时间:2013-02-05 17:07:59

标签: c# windows backup

我们在本地网络上的系统中有许多文件(word,excel)。我们每天都会从这些文件中获得备份。现在我想知道:文件是否与备份不同?例如,假设我们有一个文件“test.docx”,它的备份名称是“test_backup.docx”,我想知道如果用户对“test.docx”进行了任何更改?我想比较这两个文件。

一种方法是逐字比较这些文件,当检测到差异时,我们可以断定文件已更新。

现在我的问题是,是否有任何其他方式,如校验和,用于检测这种差异?我可以通过这种方法找到更新的位置吗?

感谢。

2 个答案:

答案 0 :(得分:0)

你见过SyncToy吗?

听起来你想要自动化备份复制过程而你并不真正关心特定的差异,只是试图确定是否存在。我的答案基于这一推定。

散列是一种很好的方法,可以确定文件是否应真正备份,但它需要读取整个文件并在其上执行昂贵的任务。

您可以通过查看文件的大小和时间戳来预处理备份文件列表 - 修改,访问:如果它们不匹配 - 请在没有校验和的情况下备份它们。如果它们匹配,那么由你来决定它们是相同的还是散列内容,我首先假设它们是相同的,如果所有时间戳和大小都与备份副本相匹配,并且如果这种启发式证明是错误的 - 求助于散列,但是找到fastest algorithm possible - 你的哈希应用似乎并不需要高安全性而是高性能,SHA和MD5都会因为可怕的性能而过度杀伤

答案 1 :(得分:0)

以下是我们计算文件签名的方法:

public static string Signature(this FileInfo input)
{
    MD5CryptoServiceProvider cryptoTransform = new MD5CryptoServiceProvider();
    FileStream fs = new FileStream(input.FullName, FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(fs);
    byte[] data = reader.ReadBytes((int)fs.Length);
    string hash = BitConverter.ToString(cryptoTransform.ComputeHash(data)).Replace("-", "");
    reader.Close();
    fs.Close();
    return hash;
}

然后,我们根据先前版本的签名计算该签名以检测更改。