我试图在文件服务器上查找给定唯一文件的所有副本。这是我所做的:
- 获取唯一文件的哈希码。
- 将唯一文件的散列码与文件服务器上每个文件的散列码进行比较。如果相等,则添加到重复列表中。
这可以完成工作但需要很长时间(我的文件服务器上有 20 万个文件)所以我不得不考虑其他事情,这就是我所做的:
- 获取唯一文件的哈希码。
- 获取唯一文件的字节大小。
- 获取具有相同文件大小的所有文件的列表(这非常快,因为我不需要读取文件)
- 将唯一文件的哈希码与入围文件的每个文件进行比较。
这将完成任务所需的时间从几小时减少到 10 分钟,但这仍然不是很好,尤其是在尝试为一堆文件查找重复项时。每个文件搜索需要 10 分钟意味着 100 个文件将需要 16 个小时!
是否有比哈希码更好的唯一文件标识符?获取哈希码是这个过程中最耗时的事情。
谢谢,
最佳答案
通过哈希码搜索重复项绝对是最慢的方法;大量磁盘 I/O 和 CPU 处理。
我在这方面有一些经验,我们发现最快的方法是尽快删除文件:
- 按文件大小分组的短列表
- 逐字节比较每组所有文件的前 256 个字节。这应该会消除很多文件。
- 在第 2 步循环,但每次迭代时将缓冲区大小加倍(最大为 16K 左右)
在循环中打开/关闭所有这些文件句柄确实是一个轻微的开销,但不如完全读取所有文件那么多。
关于c# - 查找文件重复项 - 最好是 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758365/