/// <summary> /// Получить список файлов из указанного пути. /// </summary> public bool GetFiles() { if (!IsSourceFolderExists(Path)) { return(false); } Count = 0; foreach (var fileName in Directory.GetFiles(Path, "*", System.IO.SearchOption.AllDirectories)) { var fileInfo = new FileInfo(fileName); var fileDesc = new FileDesc { Name = fileName, Size = fileInfo.Length, CreationTime = fileInfo.CreationTime, Guid = Guid.NewGuid(), MD5Summ = string.Empty, CountDuplicates = 0 }; FullListFiles.Add(fileDesc); Count++; } FindDuplicatedBySize(); CountDuplicated(); return(true); }
/// <summary> /// Удалить элемент из списка по идентификатору. /// </summary> /// <param name="id"></param> public void DeleteItem(Guid id) { var itemToDelete = FullListFiles.Where(x => x.Guid == id).Select(x => x).First(); EdfFiles.DeleteFile(itemToDelete.Name); FullListFiles.Remove(itemToDelete); }
/// <summary> /// Отобрать дубликаты по размеру файла и рассчитать для них контрольную сумму. /// </summary> private void FindDuplicatedBySize() { var groupBySize = FullListFiles .GroupBy(f => new { f.Size }) .Select(g => new { size = g.Key.Size, count = g.Count() }) .Where(_ => _.count > 1) .ToArray(); // FillListFiles(listViewCandidate, groupBySize); // Перебор полученных файлов. foreach (var info in groupBySize) { foreach (var fileDesc in FullListFiles) { if (fileDesc.Size.ToString() == (info.size.ToString())) { fileDesc.MD5Summ = GetMD5HashFromFile(fileDesc.Name); } } } }
/// <summary> /// Подсчитать дубликаты по контрольной сумме и размеру. /// </summary> private void CountDuplicated() { var groupByMD5 = FullListFiles .GroupBy(f => new { f.MD5Summ, f.Size }) .Select(g => new { md5 = g.Key.MD5Summ, size = g.Key.Size, count = g.Count() }) .Where(_ => _.count > 1) .ToArray(); this.CountUnique = 0; this.CountDuplicates = 0; foreach (var info in groupByMD5) { CountUnique++; for (int i = 0; i < FullListFiles.Count; i++) { // Устанавливаем количество, есть MD5 совпадают. if (FullListFiles[i].MD5Summ == info.md5) { FullListFiles[i].CountDuplicates = info.count; CountDuplicates++; } } } }