查找文件夹中相同的文件 – C# 实现(原始版)
今日公司一个网络共享盘600G,活生生的被我们塞满到了只剩下300MB,我就在想如何可以从中释放出更多的空间来。共享盘的使用时间有很多年,其中必定有很多文件其实是重复的,被不同的人存了好几份,久而久之就导致了硬盘空间的极度浪费。我们平时在自己电脑中可能也会存在这种文件,特别是mp3啊,图片啊啥么的。
为了解决这个问题,我写了一个简单的小程序来遍历制定的目录,并找出其中相同的两个文件。想法很简单,遍历目录下的所有文件(包含所有子目录),算出遍历到的文件的MD5值,如果有多个文件的MD5值相等就说明这几个文件就是冗余的。说白了这个程序主要就三个主要功能需要实现:遍历目录 + 计算MD5值 + 找到相等后处理。
核心代码如下,利用递归的方法遍历制定目录下的所有文件,并计算哈希值。
/// <summary>< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
/// A Recursive way to traverse all file in the root path
/// </summary>
/// <param name="path">root path need to traverse</param>
/// <param name="level">the max level need to traverse</param>
private void TraverseAll(string path, int level)
{
if (level > maxLevel)
return;
DirectoryInfo curDirInfo = new DirectoryInfo(path);
DirectoryInfo[] childDirs = curDirInfo.GetDirectories();
FileInfo[] childFiles = curDirInfo.GetFiles();
TraverseFiles(childFiles);//此方法遍历所有文件,并记录下重复的
foreach (DirectoryInfo dir in childDirs)
{
TraverseAll(dir.FullName, level + 1);
}
}
/// <summary>
/// Traverse all files pass in, if duplicate record
/// </summary>
/// <param name="files">file list</param>
private void TraverseFiles(FileInfo[] files)
{
foreach (FileInfo f in files)
{
string hashCode = GetFileHashCode(f.FullName);//计算MD5值
try
{
fileTraversed.Add(hashCode, path);
}
catch//如果hashCode已经存在则会抛一个异常
{
if (duplicatedFile.IndexOf(fileTraversed[hashCode].ToString()) < 0)
{
duplicatedFile.Add(fileTraversed[hashCode].ToString());
}
duplicatedFile.Add(path);
}
}
}
完整的Traverse类:http://goo.gl/Og9bX
很愉快的完成了这个功能,但是这个程序的执行速度是蜗牛般的慢,这个我一开始就料到了,只是想写一个实现这个功能。
有以下几点可以改进:
1. 不需要每一个文件都计算MD5值,这个对于大文件太耗时间,可以大概分三层过滤,首先判断文件大小,大小相等计算可以用CRC校验(我不知道这个效率如何)或者可以取文件的几个部分进行校验,如果这步还相等则最后计算MD5值;
2. 计算HashCode对大文件来说是一个很漫长的过程,可以起多个线程来对文件进行计算,这样就会因为一个大文件而让其他没被计算的小文件无法快速计算。(而且现在计算机都是多核的,不用白不用);
3. TraverseFiles这个方法的参数可以通过引用传入,这样如果目录下文件很多的情况下就不用浪费很多内存。
-- The End --
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述