Feedback

C# - doppelte dateien in ordner finden

Veröffentlicht von am 11/22/2015
(0 Bewertungen)
Mit den beiden funktionen kann man einen ordner rekursiv nach identischen dateien durchsuchen. Die rückgabe ist eine liste der gleichen paare.

foreach (var pair in FindDoubles(new DirectoryInfo(@"c:\ein\ordner")))
{
Console.WriteLine($"{pair.Item1.Name} == {pair.Item2.Name}");
}
using System.IO;
using System.Security.Cryptography;

private void TraverseDirectory(DirectoryInfo directory, List<Tuple<FileInfo, FileInfo>> doubles, Dictionary<string, FileInfo> hashes)
{
	using (var md5 = MD5.Create())
	{
		foreach (var file in directory.GetFiles())
		{
			using (var stream = file.OpenRead())
			{
				var hash = BitConverter.ToString(md5.ComputeHash(stream));
				FileInfo alreadyFound;
				if (hashes.TryGetValue(hash, out alreadyFound))
				{
					doubles.Add(Tuple.Create(alreadyFound, file));
				}
				else
				{
					hashes.Add(hash, file);
				}
			}
		}
	}
			
	foreach (var sub in directory.GetDirectories())
	{
		TraverseDirectory(sub, doubles, hashes);
	}
}

public List<Tuple<FileInfo, FileInfo>> FindDoubles(DirectoryInfo directory)
{
	if (directory == null)
	{
		throw new ArgumentNullException();
	}
	if (!directory.Exists)
	{
		throw new FileNotFoundException();
	}

	var doubles = new List<Tuple<FileInfo, FileInfo>>();
	var hashes = new Dictionary<string, FileInfo>();

	TraverseDirectory(directory, doubles, hashes);

	return doubles;
}
Abgelegt unter directory, double, md5.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!