现在有文件1.43GB 、共有11106个文件。
单个文件好像最多有10个重复项。要求算出文件 MD5/SHA1/CRC32 ,删除重复文件。菜鸟求指导!!!!求指导!!!!指导!!!!!!!!!!!!!!
刚接触编程,请各位说的详细点。

解决方案 »

  1.   

    这么明白了还要说什么?计算11106个文件的MD5,或者SHA1,MD5散列值只有128位,所以你可以把11106个文件的MD5放在内存数组中,绝对可以放得下,如果两个文件相等,那么它们的MD5必然相等,但两个文件MD5相等它们的内容不一定相等,不过不相等的概率极小,所以你只需要找出MD5散列值相等的那些文件,这个可以用Dictionary散列来高效率实现,然后再比较MD5相等的文件内容,如果相等就删除,
      

  2.   

    Dictionary散列,这个真不知道。
      

  3.   

    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.   

    4 楼 的MD5List.Contains(strMD5)效率不高,建议把List<String> MD5List 改为HashSet<string> MD5List
      

  5.   


    学习
    但是
    一两千的数据量,应该差别不大吧
    瓶颈应该是在GetFileMD5上