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<Class1> filesinfo = new List<Class1>();
List<long> filessize = new List<long>();
List<Class1> filesnames = new List<Class1>();
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();
}
}
}