首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【求指点】一个删除重复文件的实现!

2012-08-16 
【求指导】一个删除重复文件的实现!!!现在有文件1.43GB 、共有11106个文件。单个文件好像最多有10个重复项。要

【求指导】一个删除重复文件的实现!!!
现在有文件1.43GB 、共有11106个文件。
单个文件好像最多有10个重复项。

要求算出文件 MD5/SHA1/CRC32 ,删除重复文件。

菜鸟求指导!!!!

求指导!!!!

指导!!!!

!!!!

!!!

!!


刚接触编程,请各位说的详细点。

[解决办法]
这么明白了还要说什么?计算11106个文件的MD5,或者SHA1,

MD5散列值只有128位,所以你可以把11106个文件的MD5放在内存数组中,绝对可以放得下,如果两个文件相等,那么它们的MD5必然相等,但两个文件MD5相等它们的内容不一定相等,不过不相等的概率极小,

所以你只需要找出MD5散列值相等的那些文件,这个可以用Dictionary散列来高效率实现,然后再比较MD5相等的文件内容,如果相等就删除,

[解决办法]
按照文件长度排序,只对文件长度一样的文件计算md5。
[解决办法]

C# code
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

热点排行