目录
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Windows.Forms;
namespace ImageDuplicate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string FolderPath = "";
List<ImgFileInfo> ltFile = new List<ImgFileInfo>();
private void button1_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog(this) != DialogResult.OK)
{
return;
}
textBox1.Text = "";
FolderPath = "";
ltFile.Clear();
dataGridView1.DataSource = null;
Application.DoEvents();
button1.Enabled = false;
button2.Enabled = false;
FolderPath = dialog.SelectedPath + @"\";
textBox1.Text = FolderPath;
DirectoryInfo root = new DirectoryInfo(FolderPath);
foreach (FileInfo f in root.GetFiles())
{
ltFile.Add(new ImgFileInfo(f.Name, GetFileMD5(FolderPath + f.Name)));
}
//var sortlist = ltFile.OrderBy(o => o.md5).ToList();
var listGroup = ltFile.GroupBy(o => o.md5)
.Select(g => (new
{
md5 = g.Key,
num = g.Count(),
fileName = string.Join(",", g.Select(d => d.fileName))
}))
.OrderByDescending(o => o.num)
.ThenBy(o => o.md5)
.ToList();
dataGridView1.DataSource = listGroup;
//自适应所有列的宽度
//dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.Columns[0].Width = 300;
dataGridView1.Columns[1].Width = 50;
dataGridView1.Columns[2].Width = 850;
button1.Enabled = true;
button2.Enabled = true;
}
public static string GetFileMD5(string path)
{
if (!System.IO.File.Exists(path)) return "";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
byte[] buffer = md5Provider.ComputeHash(fs);
string resule = BitConverter.ToString(buffer);
md5Provider.Clear();
fs.Close();
return resule;
}
/// <summary>
/// 去重复
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
}
}
}