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); }
/// <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)); }
/// <summary> /// 文件提取器构造函数 /// </summary> /// <param name="directory">搜寻文件的目录</param> /// <param name="compareMode">指定文件的比较方式,用于排序</param> public FileExtractor(string directory, FileCompareMode compareMode) : this(directory, compareMode, FileSortMode.Descending) { }