Eğer varsa do gerçekten bir ihtiyaç karar tam bayt bayt karşılaştırma (hash tartışılması için diğer yanıtları görmek), sonra en kolay çözümdür:
• System.IO.FileInfo
örnekler için:
public static bool AreFileContentsEqual(FileInfo fi1, FileInfo fi2) =>
fi1.Length == fi2.Length &&
(fi1.Length == 0 || File.ReadAllBytes(fi1.FullName).SequenceEqual(
File.ReadAllBytes(fi2.FullName)));
• System.String
yol adları için:
public static bool AreFileContentsEqual(String path1, String path2) =>
AreFileContentsEqual(new FileInfo(path1), new FileInfo(path2));
Gönderilen diğer yanıtların aksine, bu her türlü dosya için kesin olarak doğrudur : ikili, metin, medya, yürütülebilir vb., Ancak tam bir ikili karşılaştırma olarak , yalnızca "önemsiz" şekillerde ( BOM , satır gibi) farklılık gösteren dosyalar -kullanma , karakter kodlama , medya meta verileri, boşluk, dolgu, kaynak kodu yorumları vb.) her zaman eşit değildir .
Bu kod her iki dosyayı da tamamen belleğe yükler, bu yüzden gerçekten devasa dosyaları karşılaştırmak için kullanılmamalıdır . Bu önemli uyarının ötesinde, .NET GC'nin tasarımı göz önüne alındığında tam yükleme gerçekten bir ceza değildir (çünkü küçük, kısa ömürlü tahsisleri son derece ucuz tutmak için temelde optimize edilmiştir ) ve aslında dosya boyutları beklendiğinde bile optimal olabilir daha az olacak şekilde 85K (burada gösterildiği gibi) kullanıcı kodunun minimum kullanarak maksimum dosya performans sorunları devrederek ima çünkü CLR
, BCL
ve JIT
(örneğin) son tasarım teknolojisi, sistem kodu ve adaptif çalışma zamanı optimizasyonlarından yararına.
Ayrıca, bu tür geçici senaryolar için, LINQ
numaralandırıcılar (burada gösterildiği gibi) üzerinden bayt bayt karşılaştırması performansıyla ilgili endişeler tartışmalıdır, çünkü dosya G / Ç için diske a̲t̲ a̲l̲l̲ vurmak, çeşitli büyüklüklerde, çeşitli bellek karşılaştırma alternatifleri. Örneğin, aslında bize ilk uyumsuzluktan vazgeçmenin "optimizasyonunu" verse SequenceEqual
de , dosya içeriğini zaten getirdikten sonra bu neredeyse hiç önemli değil, her biri eşleşmeyi onaylamak için gerekli ..