private List <Duplicate> checkByMode(List <Duplicate> duplicates, FileCompareMode fileCompareMode)
        {
            List <Duplicate> filteredDuplicates = new List <Duplicate>();

            switch (fileCompareMode)
            {
            case FileCompareMode.FileSize:
                var filteredDuplicatesGroupedBySize = duplicates
                                                      .GroupBy(x => x.DuplicateObjects.First().FileSize)
                                                      .Where(grp => grp.Count() > 1);

                foreach (var group in filteredDuplicatesGroupedBySize)
                {
                    Duplicate duplicate = new Duplicate();
                    List <DuplicateObject> duplicateObjects = new List <DuplicateObject>();

                    foreach (var item in group)
                    {
                        duplicateObjects.Add(new DuplicateObject()
                        {
                            FileName = item.DuplicateObjects.First().FileName,
                            FilePath = item.DuplicateObjects.First().FilePath,
                            FileSize = item.DuplicateObjects.First().FileSize,
                            MD5Hash  = item.DuplicateObjects.First().MD5Hash
                        });
                    }
                    duplicate.DuplicateObjects = duplicateObjects;
                    filteredDuplicates.Add(duplicate);
                }
                break;

            case FileCompareMode.FileSizeFileName:
                var filteredDuplicatesGroupedBySizeName = duplicates
                                                          .GroupBy(x => new { x.DuplicateObjects.First().FileName, x.DuplicateObjects.First().FileSize })
                                                          .Where(grp => grp.Count() > 1);
                foreach (var group in filteredDuplicatesGroupedBySizeName)
                {
                    Duplicate duplicate = new Duplicate();
                    List <DuplicateObject> duplicateObjects = new List <DuplicateObject>();
                    foreach (var item in group)
                    {
                        duplicateObjects.Add(new DuplicateObject()
                        {
                            FileName = item.DuplicateObjects.First().FileName,
                            FilePath = item.DuplicateObjects.First().FilePath,
                            FileSize = item.DuplicateObjects.First().FileSize,
                            MD5Hash  = item.DuplicateObjects.First().MD5Hash
                        });
                    }
                    duplicate.DuplicateObjects = duplicateObjects;
                    filteredDuplicates.Add(duplicate);
                }
                break;
            }
            return(filteredDuplicates);
        }
Example #2
0
 /// <summary>
 /// 文件提取器构造函数
 /// </summary>
 /// <param name="directory">搜寻文件的目录</param>
 /// <param name="compareMode">指定文件的比较方式,用于排序</param>
 /// <param name="sortMode">排序方式,升序或降序</param>
 public FileExtractor(string directory, FileCompareMode compareMode, FileSortMode sortMode)
 {
     this.directory = directory;
     if (!this.directory.EndsWith("\\"))
     {
         this.directory += "\\";
     }
     this.compareMode = compareMode;
     this.sortMode    = sortMode;
 }
        public IEnumerable <IDuplicate> LookupCandidate(string path, FileCompareMode mode)
        {
            List <Duplicate> duplicates = new List <Duplicate>();

            try
            {
                List <string> dirs = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories).ToList <string>();

                foreach (string filePath in dirs)
                {
                    FileInfo fileInfo = new FileInfo(filePath);

                    Duplicate duplicate = new Duplicate();
                    duplicate.DuplicateObjects = new List <DuplicateObject>()
                    {
                        new DuplicateObject {
                            FilePath = filePath,
                            FileSize = fileInfo.Length,
                            FileName = fileInfo.Name,
                            MD5Hash  = string.Empty
                        }
                    };
                    duplicates.Add(duplicate);
                }
                duplicates = checkByMode(duplicates, mode.Equals(FileCompareMode.FileSize) ? FileCompareMode.FileSize : FileCompareMode.FileSizeFileName);
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
            catch (DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }

            return(CheckCandidates(duplicates));
        }
Example #4
0
 /// <summary>
 /// 文件提取器构造函数
 /// </summary>
 /// <param name="directory">搜寻文件的目录</param>
 /// <param name="compareMode">指定文件的比较方式,用于排序</param>
 public FileExtractor(string directory, FileCompareMode compareMode)
     : this(directory, compareMode, FileSortMode.Descending)
 {
 }