使用.Net在两个文件夹中查找相同的文件

时间:2014-08-09 05:42:44

标签: c# .net

我有一个带有音乐视频的文件夹,我想从笔记本电脑备份到外部硬盘。我不想使用备份 - 图像,而是直接文件复制,这样我就可以直接在另一台计算机/笔记本电脑或控制台上观看来自备份硬盘的音乐视频。

我可以使用免费软件SyncBack Free将文件镜像到外部硬盘。 SyncBack Free是一个很好的工具,但它似乎并不能完全满足我的需求。问题是我喜欢不时修改我的音乐视频的文件名。虽然SyncBack Free可以选择具有相同内容的文件,但它似乎不适用于视频,并且在文件名更改后同步时,每个文件夹中的同一文件最终会有两个副本。

因此我正在考虑编写自己的免费软件备份软件。

问题是: - 如何使用c#/ .Net 4.0识别相同的文件而不使用文件名?我想为文件生成哈希值或校验和而不太了解它 - 真的用于备份软件会慢吗?

1 个答案:

答案 0 :(得分:2)

你可以得到像这样的文件的哈希

using System.Security.Cryptography;

static string GetFileHash(string filename)
{
    byte[] data = File.ReadAllBytes(filename);
    byte[] hash = MD5.Create().ComputeHash(data);
    return Convert.ToBase64String(hash);
}

MD5不是最安全的哈希,但它仍然很快,这使得它对文件校验和有利。如果文件很大,ComputerHash()也需要Stream

您可能还想查看HashLib库中的其他一些校验和算法。它包含CRC和其他算法,应该更快。你可以用nuget下载它。

您还可以使用其他策略,例如检查前x个字节是否相同。

您可以保留已备份的哈希数据库,这样您就不必在每次备份运行时重新计算哈希值。您可以仅遍历自上次备份时间以来已修改的文件,并查看它们的哈希是否在您的哈希数据库中。如果您希望备份程序可移植,SQLite会成为一个很好的数据库。