using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Security.Cryptography; namespace WindowsFormsApplication1 { public partial class Form1 : Form { DriveInfo[] dis = DriveInfo.GetDrives(); List filesinfo = new List(); List filessize = new List(); List filesnames = new List(); public void FindInDir(DirectoryInfo dir, string pattern) // поиск файлов в папке, проблема с закрытым доступом к папкам { foreach (FileInfo file in dir.GetFiles(pattern)) { this.listView1.Items.Add(file.FullName); filesinfo.Add(new Class1() { FileName = file.Name, FileFullName =file.FullName, FileSize = file.Length }); } foreach (DirectoryInfo subdir in dir.GetDirectories()) { this.FindInDir(subdir, pattern); } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { filesinfo.Clear(); //очистка списков перед работой filessize.Clear(); filesnames.Clear(); try { foreach (DriveInfo di in dis) { if (di.IsReady) { DirectoryInfo dir = new DirectoryInfo(di.Name/*"H:\\"*/); string file = "*.*"; richTextBox1.AppendText(" Диск " + di.Name + Environment.NewLine); FindInDir(dir, file); } } } catch (UnauthorizedAccessException) { throw; } catch (IOException ex) { MessageBox.Show((ex.GetType().Name)); } var FileSGroup = filesinfo.GroupBy(p1 => p1.FileSize) // группировка файлов по размеру .Where(p1 => p1.Count() > 1) // фильтр не дублей .Select(g => new { FileSize = g.Key, Count = g.Count() }); foreach (var group in FileSGroup) // запись значений размера дублей во второй список { filessize.Add(group.FileSize); } foreach (Class1 cl in filesinfo) // сравнение первичного списка файлов по размеру с дубликатами и запись подходящих в третий список { for (int i = 0; i < filessize.Count; i++) { if (cl.FileSize == filessize[i] ) { filesnames.Add(new Class1() { FileName = cl.FileName, FileFullName = cl.FileFullName, FileSize = cl.FileSize }); } } } var SortedFiles = from f in filesnames // сортировка по размеру orderby f.FileSize descending select f; foreach (Class1 cl in SortedFiles) // вывод списка в текстбокс. Расчет хеша надо сделать после группировки дублей { richTextBox1.AppendText("Имя файла: " + cl.FileFullName + "Размер файла: " + cl.FileSize + " хеш = " + GetMD5HashFromFile(cl.FileFullName)+ Environment.NewLine); } } class Class1 { public string FileName { get; set; } public string FileFullName { get; set; } public long FileSize { get; set; } public override string ToString() { return " Name: " + FileName + " Size: " + FileSize; } } public string GetMD5HashFromFile(string fileName) // подсчет хеша, стянул блоком { FileStream file = new FileStream(fileName, FileMode.Open); MD5 md5 = new MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } private void button2_Click(object sender, EventArgs e) { richTextBox1.Text = ""; richTextBox1.Clear(); listView1.Text = ""; listView1.Clear(); } } }