Jeśli nie zdecydujesz, że naprawdę potrzebujesz pełnego porównania bajt po bajcie (zobacz inne odpowiedzi w celu omówienia haszowania), najłatwiejszym rozwiązaniem jest:
• na System.IO.FileInfo
przykład:
public static bool AreFileContentsEqual(FileInfo fi1, FileInfo fi2) =>
fi1.Length == fi2.Length &&
(fi1.Length == 0 || File.ReadAllBytes(fi1.FullName).SequenceEqual(
File.ReadAllBytes(fi2.FullName)));
• dla System.String
nazw ścieżek:
public static bool AreFileContentsEqual(String path1, String path2) =>
AreFileContentsEqual(new FileInfo(path1), new FileInfo(path2));
W przeciwieństwie do innych opublikowanych odpowiedzi, jest to bezsprzecznie poprawne dla każdego rodzaju plików: binarnych, tekstowych, multimedialnych, wykonywalnych itp., Ale jako pełne porównanie binarne pliki, które różnią się tylko w „nieistotny” sposób (np. BOM , wiersz -ending , kodowanie znaków , metadane multimediów, spacje, dopełnienie, komentarze w kodzie źródłowym itp.) zawsze będą uważane za nierówne .
Ten kod ładuje oba pliki w całości do pamięci, więc nie powinien być używany do porównywania naprawdę gigantycznych plików . Poza tym ważnym zastrzeżeniem, pełne ładowanie nie jest tak naprawdę karą, biorąc pod uwagę projekt .NET GC (ponieważ jest zasadniczo zoptymalizowany, aby utrzymywać bardzo niskie , krótkotrwałe alokacje niezwykle tanie ), a w rzeczywistości może być nawet optymalne, gdy oczekuje się rozmiaru pliku powinna być mniejsza niż 85k , ponieważ przy użyciu minimum kodu użytkownika (patrz tutaj) implikuje maksymalnie delegowanie problemów z wydajnością do pliku CLR
, BCL
oraz JIT
do korzystania z (na przykład) najnowszej technologii projektowania, kod systemu i adaptacyjnych optymalizacje uruchomieniowych.
Ponadto w takich scenariuszach dnia roboczego obawy dotyczące wydajności porównywania bajt po bajcie za pomocą modułów LINQ
wyliczających (jak pokazano tutaj) są dyskusyjne, ponieważ uderzenie w dysk a̲t̲ a̲l̲l̲ dla wejścia / wyjścia pliku przyćmiewa o kilka rzędów wielkości korzyści różnych alternatyw porównujących pamięć. Na przykład, choć SequenceEqual
nie w rzeczywistości daje nam „Optymalizacja” z porzucenie na pierwszym niedopasowania , to nie ma znaczenia po już pobrana zawartość pliki, każdy w pełni należy potwierdzić meczu ..