Wie kann ich in C# feststellen, ob zwei Dateien absolut identisch sind (Größe, Inhalt usw.)?C# Dateiverwaltung
Antwort
Oder Sie können die beiden Dateien Byte-für-Byte ....
Hier ist eine einfache Lösung, vergleichen, die nur die beiden Dateien liest und vergleicht die Daten. Es sollte nicht langsamer als die Hash-Methode sein, da beide Methoden die gesamte Datei lesen müssen. EDIT Wie von anderen bemerkt, ist diese Implementierung wegen ihrer Einfachheit tatsächlich etwas langsamer als die Hash-Methode. Siehe unten für eine schnellere Methode.
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;
}
Sie können es ändern, mehr als ein Byte zu einem Zeitpunkt, zu lesen, aber der interne Dateistrom sollte bereits die Daten werden Pufferung, so dass selbst diese einfache Code sollte relativ schnell sein.
EDIT Danke für die Rückmeldung über die Geschwindigkeit hier. Ich behaupte immer noch, dass die Compare-all-bytes-Methode genauso schnell wie die MD5-Methode sein kann, da beide Methoden die gesamte Datei lesen müssen. Ich würde vermuten (aber nicht sicher wissen), dass, sobald die Dateien gelesen wurden, die Compare-all-bytes-Methode weniger tatsächliche Berechnung erfordert. In jedem Fall habe ich Ihre Leistungsbeobachtungen für meine erste Implementierung dupliziert, aber als ich einige einfache Pufferung hinzugefügt habe, war die Compare-all-bytes-Methode genauso schnell. Unten ist die Pufferung-Implementierung, fühlen Sie sich frei, weiter zu kommentieren!
BEARBEITEN Jon B macht noch einen guten Punkt: Wenn die Dateien tatsächlich unterschiedlich sind, kann diese Methode stoppen, sobald sie das erste andere Byte findet, während die Hash-Methode die Gesamtheit beider Dateien lesen muss in jedem Fall.
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;
}
Was mir besonders gefällt ist, dass Sie schon früh einen binären Unterschied feststellen, wenn Sie große Dateien gleicher Länge vergleichen. –
- 1. Dateiverwaltung steuert
- 2. C Struktur und Dateiverwaltung newb - kämpfen
- 3. iPhone SQLite Dateiverwaltung
- 4. Sichere Dateiverwaltung mit Symfony
- 5. Best Practices für die Dateiverwaltung
- 6. Rails Dateiverwaltung und E-Mail Verteilung kombiniert
- 7. WebApi & Odata - geeignet für die Dateiverwaltung?
- 8. Welches iOS unterstützt die Dateiverwaltung mit tel: //?
- 9. Xcode Dateiverwaltung. Was ist die beste Vorgehensweise?
- 10. Wo sucht Visual Studio bei der Dateiverwaltung nach txt-Dateien?
- 11. Beliebige Bibliotheken/Module für die Dateiverwaltung in Python?
- 12. Binärdateien in C++
- 13. 'Klammerinitialisierung'. (C++)
- 14. Datensatz in einer Datei löschen (C-Programmierung)
- 15. C/C++/Objective-C-Texterkennungsbibliothek
- 16. Differenz zwischen scanf ("% c", & c) und scanf ("% c", & c)
- 17. Eye-Tracking-Bibliothek in C#, C/C++ oder Objective-C
- 18. Matlab in C C++ und C C++ in Matlab
- 19. C/C++/C#/VB-basierte Lexikalische Analysatoren
- 20. virtuelle Datei? in c/C++ oder C#
- 21. main() in C, C++, Java, C#
- 22. C/C++/C# SetWindowPos: Fenster über anderen
- 23. Einführung in C# für C/C++ - Benutzer
- 24. Natives C++ zu verwaltetes C++ zu C#
- 25. statisches Array in C# vs C/C++
- 26. Externe C/C++ - Bibliothek nicht in C#
- 27. Testcode in C C++
- 28. C++ Union in C#
- 29. typedef wie C/C++
- 30. C/C++ URL-Dekodierbibliothek
Es ist schneller für NUR 2 Dateien als Hash-Code-Computing. Du hast eins. – TcKs