日期:2014-05-18  浏览次数:20902 次

【求指导】一个删除重复文件的实现!!!
现在有文件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