Si no decide que realmente necesita una comparación completa byte por byte (consulte otras respuestas para analizar el hash), entonces la solución más fácil es:
• por System.IO.FileInfo
instancias:
public static bool AreFileContentsEqual(FileInfo fi1, FileInfo fi2) =>
fi1.Length == fi2.Length &&
(fi1.Length == 0 || File.ReadAllBytes(fi1.FullName).SequenceEqual(
File.ReadAllBytes(fi2.FullName)));
• para System.String
nombres de ruta:
public static bool AreFileContentsEqual(String path1, String path2) =>
AreFileContentsEqual(new FileInfo(path1), new FileInfo(path2));
A diferencia de otras respuestas publicadas, esto es concluyentemente correcto para cualquier tipo de archivo: binario, texto, medios, ejecutable, etc., pero como una comparación binaria completa , archivos que difieren solo en formas "sin importancia" (como BOM , línea -final , codificación de caracteres , metadatos de medios, espacios en blanco, relleno, comentarios de código fuente, etc.) siempre se considerarán no iguales .
Este código carga ambos archivos en la memoria por completo, por lo que no debe usarse para comparar archivos verdaderamente gigantescos . Más allá de esa advertencia importante, la carga completa no es realmente una penalización dado el diseño de .NET GC (porque está optimizado fundamentalmente para mantener las asignaciones pequeñas y de corta duración extremadamente baratas ), y de hecho incluso podría ser óptimo cuando se espera un tamaño de archivo a ser inferior a 85K , porque el uso de un mínimo de código de usuario (como se muestra aquí) implica delegar al máximo los problemas de rendimiento archivo al CLR
, BCL
y JIT
que se benefician de (por ejemplo) la última tecnología de diseño, código de sistema, y optimizaciones de tiempo de ejecución de adaptación.
Además, para tales escenarios de días de trabajo, las preocupaciones sobre el rendimiento de la comparación byte a byte a través de LINQ
enumeradores (como se muestra aquí) son discutibles, ya que golpear el disco a̲t̲ a̲l̲l̲ para E / S de archivo empequeñecerá, en varios órdenes de magnitud, los beneficios de las diversas alternativas de comparación de memoria. Por ejemplo, a pesar de que SequenceEqual
no , de hecho, nos dará la "optimización" de abandonar en la primera falta de coincidencia , esto importa poco después de tener ya leídos contenidos de los ficheros, cada uno totalmente necesaria para confirmar el partido ..