¿Cómo puedo detectar en C# si dos archivos son absolutamente idénticos (tamaño, contenido, etc.)?C# file management
Respuesta
O puede comparar los dos archivos byte por byte ....
Aquí hay una solución simple, que solo lee los archivos y compara los datos. No debería ser más lento que el método hash, ya que ambos métodos tendrán que leer todo el archivo. EDITAR Según lo observado por otros, esta implementación es en realidad algo más lenta que el método hash, debido a su simplicidad. Vea a continuación un método más rápido.
static bool FilesAreEqual(string f1, string f2)
{
// get file length and make sure lengths are identical
long length = new FileInfo(f1).Length;
if(length != new FileInfo(f2).Length)
return false;
// open both for reading
using(FileStream stream1 = File.OpenRead(f1))
using(FileStream stream2 = File.OpenRead(f2))
{
// compare content for equality
int b1, b2;
while(length-- > 0)
{
b1 = stream1.ReadByte();
b2 = stream2.ReadByte();
if(b1 != b2)
return false;
}
}
return true;
}
Se puede modificarlo para leer más de un byte a la vez, pero el flujo de archivos interno ya debe estar amortiguando los datos, por lo que incluso este simple código debe ser relativamente rápido.
EDIT Gracias por los comentarios sobre la velocidad aquí. Sigo manteniendo que el método compare-all-bytes puede ser tan rápido como el método MD5, ya que ambos métodos tienen que leer todo el archivo. Sospecho (pero no estoy seguro) que una vez que se han leído los archivos, el método de comparar todos los bytes requiere menos cálculos reales. En cualquier caso, dupliqué tus observaciones de rendimiento para mi implementación inicial, pero cuando agregué un simple almacenamiento en búfer, el método de comparar todos los bytes fue igual de rápido. A continuación se muestra la implementación de almacenamiento en búfer, no dude en comentar más!
EDITAR Jon B hace otro buen punto: en el caso de que los archivos de hecho son diferentes, este método puede parar tan pronto como se encuentra el primer byte diferente, mientras que el método de hash tiene que leer la totalidad de ambos archivos en cada caso.
static bool FilesAreEqualFaster(string f1, string f2)
{
// get file length and make sure lengths are identical
long length = new FileInfo(f1).Length;
if(length != new FileInfo(f2).Length)
return false;
byte[] buf1 = new byte[4096];
byte[] buf2 = new byte[4096];
// open both for reading
using(FileStream stream1 = File.OpenRead(f1))
using(FileStream stream2 = File.OpenRead(f2))
{
// compare content for equality
int b1, b2;
while(length > 0)
{
// figure out how much to read
int toRead = buf1.Length;
if(toRead > length)
toRead = (int)length;
length -= toRead;
// read a chunk from each and compare
b1 = stream1.Read(buf1, 0, toRead);
b2 = stream2.Read(buf2, 0, toRead);
for(int i = 0; i < toRead; ++i)
if(buf1[i] != buf2[i])
return false;
}
}
return true;
}
Lo que me gusta particularmente de esto es que detectará una diferencia binaria desde el principio al comparar archivos grandes de la misma longitud. –
- 1. Rails i18n Config File Management Mejores prácticas
- 2. IDE base web con integración shell/file management para * nix
- 3. C# Settings Management
- 4. C# Dictionary Memory Management
- 5. Objective-C autorelease memory management
- 6. C# Project Management con Maven
- 7. ACL Check/Management en C#
- 8. C# create simple xml file
- 9. C++ Indicador FILE a stdout?
- 10. Secure File Delete en C
- 11. TFS/File Checkout desde C#
- 12. C++, Seg Faults y Memory Management
- 13. mínimo C++ make file for linux
- 14. EDI Flat File análisis con C#?
- 15. C# make file read/write from readonly
- 16. QT4 Memory Management
- 17. Netbeans: C/C++ file-template variables documentation needed
- 18. ALTER DATABASE/ADD FILE/VARIABLE FILENAME?
- 19. WebView Memory Management
- 20. Ant dependency management
- 21. Vala vapi file documentation
- 22. Lambda Expressions and Memory Management
- 23. nodejs load file
- 24. C++ Memory Management for Texture Streaming in Videogames
- 25. Mercurial Release Management
- 26. Configuration Management para Windows
- 27. EF Context Management
- 28. Agile Project Management
- 29. Release Management: mejor práctica
- 30. Git hooks management
Es más rápido para SOLO 2 archivos que la computación con código hash. Tienes una. – TcKs