【求指导】一个删除重复文件的实现!!!
现在有文件1.43GB 、共有11106个文件。
单个文件好像最多有10个重复项。
要求算出文件 MD5/SHA1/CRC32 ,删除重复文件。
菜鸟求指导!!!!
求指导!!!!
指导!!!!
!!!!
!!!
!!
!
刚接触编程,请各位说的详细点。
[解决办法]
这么明白了还要说什么?计算11106个文件的MD5,或者SHA1,
MD5散列值只有128位,所以你可以把11106个文件的MD5放在内存数组中,绝对可以放得下,如果两个文件相等,那么它们的MD5必然相等,但两个文件MD5相等它们的内容不一定相等,不过不相等的概率极小,
所以你只需要找出MD5散列值相等的那些文件,这个可以用Dictionary散列来高效率实现,然后再比较MD5相等的文件内容,如果相等就删除,
[解决办法]
按照文件长度排序,只对文件长度一样的文件计算md5。
[解决办法]
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(); } }}
[解决办法]