【求指导】一个删除重复文件的实现!!! 现在有文件1.43GB 、共有11106个文件。单个文件好像最多有10个重复项。要求算出文件 MD5/SHA1/CRC32 ,删除重复文件。菜鸟求指导!!!!求指导!!!!指导!!!!!!!!!!!!!!刚接触编程,请各位说的详细点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这么明白了还要说什么?计算11106个文件的MD5,或者SHA1,MD5散列值只有128位,所以你可以把11106个文件的MD5放在内存数组中,绝对可以放得下,如果两个文件相等,那么它们的MD5必然相等,但两个文件MD5相等它们的内容不一定相等,不过不相等的概率极小,所以你只需要找出MD5散列值相等的那些文件,这个可以用Dictionary散列来高效率实现,然后再比较MD5相等的文件内容,如果相等就删除, Dictionary散列,这个真不知道。 using System;using System.Collections.Generic;using System.IO;using System.Text;namespace ConsoleApplication1{ public class Program { /// <summary> /// 获取文件MD5 /// </summary> /// <param name="path">文件路径</param> /// <returns>MD5值</returns> public static String GetFileMD5(String path) { String strMD5 = String.Empty; try { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider()) { byte[] bytes = md5.ComputeHash(fs); strMD5 = System.BitConverter.ToString(bytes); } } } catch(Exception ex) { Console.WriteLine(String.Format("{0}\r\n{1}", path, ex.Message)); } return strMD5; } /// <summary> /// 删除重复文件 /// </summary> /// <param name="files">文件路径数组</param> private static void DeleteFile(String[] files) { List<String> MD5List = new List<String>(1000); String strMD5 = String.Empty; foreach (String path in files) { strMD5 = GetFileMD5(path); if (String.IsNullOrEmpty(strMD5)) { continue; } if (MD5List.Contains(strMD5)) { // 删除文件已存在 if (File.Exists(path)) { try { File.Delete(path); } catch(Exception ex) { Console.WriteLine(String.Format("{0}\r\n{1}", path, ex.Message)); } } } else { // 文件不存在,MD5加到列表 MD5List.Add(strMD5); } } } static void Main() { String[] files = Directory.GetFiles(@"c:\test"); if (files.Length > 1) { DeleteFile(files); } Console.ReadKey(); } }} 4 楼 的MD5List.Contains(strMD5)效率不高,建议把List<String> MD5List 改为HashSet<string> MD5List 学习但是一两千的数据量,应该差别不大吧瓶颈应该是在GetFileMD5上 我的VS2008,怎么项目模板里没有"ADO.NET Entity Data Model"? 求获得当当图书全部4级分类 [Help]C#调用DLL接收byte数组的问题。。。 关于IComparable接口的问题 《C# Language Reference》太晦涩了 ASP.NET /C# /vs2005 视频教程集合贴!!!!!!!!!!!!!!!!!!!!!! c# socket异步通信的问题 网络程序中,服务器端的编写 C#中的属性 WPF学习 扫雷小游戏 开发 想求一套C#的视频教程. 一个合并数组问题 急啊!!!!
using System.Collections.Generic;
using System.IO;
using System.Text;namespace ConsoleApplication1
{
public class Program
{
/// <summary>
/// 获取文件MD5
/// </summary>
/// <param name="path">文件路径</param>
/// <returns>MD5值</returns>
public static String GetFileMD5(String path)
{
String strMD5 = String.Empty; try
{
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider())
{
byte[] bytes = md5.ComputeHash(fs);
strMD5 = System.BitConverter.ToString(bytes);
}
}
}
catch(Exception ex)
{
Console.WriteLine(String.Format("{0}\r\n{1}", path, ex.Message));
} return strMD5;
} /// <summary>
/// 删除重复文件
/// </summary>
/// <param name="files">文件路径数组</param>
private static void DeleteFile(String[] files)
{
List<String> MD5List = new List<String>(1000);
String strMD5 = String.Empty; foreach (String path in files)
{
strMD5 = GetFileMD5(path);
if (String.IsNullOrEmpty(strMD5))
{
continue;
} if (MD5List.Contains(strMD5))
{
// 删除文件已存在
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch(Exception ex)
{
Console.WriteLine(String.Format("{0}\r\n{1}", path, ex.Message));
}
}
}
else
{
// 文件不存在,MD5加到列表
MD5List.Add(strMD5);
}
}
}
static void Main()
{
String[] files = Directory.GetFiles(@"c:\test");
if (files.Length > 1)
{
DeleteFile(files);
} Console.ReadKey();
}
}
}
学习
但是
一两千的数据量,应该差别不大吧
瓶颈应该是在GetFileMD5上