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.FileInfoinstancias:
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.Stringnombres 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, BCLy JITque 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 LINQenumeradores (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 ..