Feedback

C# - doppelte dateien in ordner finden

Veröffentlicht von am 22.11.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!