2010-03-02 23 views
17

dire che ho un file A.doc.
quindi lo copio in b.doc e lo metto in un'altra directory.
per me, è sempre lo stesso file.
ma come posso determinare che sia?
quando scarico i file a volte leggo sull'ottenere il mda5 qualcosa o il checksum, ma non so di cosa si tratta.come verificare se 2 file sono uguali usando .NET?

C'è un modo per verificare se questi file sono uguali?

+0

vuoi fare questo a livello di codice, altrimenti questo sarebbe più adatto a SuperUser.com? – cjk

+0

sì, sto creando un piccolo programma per eliminare i duplicati. – Michel

risposta

14

Se si desidera essere sicuri al 100% dei byte esatti nel file che sono gli stessi, quindi l'apertura di due flussi e il confronto di ogni byte dei file è l'unico modo.

Se si vuole essere abbastanza sicuri (99,9999%?), Vorrei calcolare un hash MD5 di ciascun file e confrontare gli hash. Controlla System.Security.Cryptography.MD5CryptoServiceProvider.

Nel mio test, se i file sono in genere equivalenti, il confronto degli hash MD5 è circa tre volte più veloce rispetto al confronto di ogni byte del file.
Se i file sono in genere diversi, il confronto byte per byte sarà molto più veloce, poiché non è necessario leggere l'intero file, è possibile interrompere non appena un singolo byte differisce.

Modifica: Inizialmente ho basato questa risposta su un test rapido che leggeva da ogni file byte per byte e li confrontava byte per byte. Ho assunto erroneamente che la natura bufferizzata di System.IO.FileStream mi avrebbe risparmiato dal preoccuparmi delle dimensioni dei blocchi del disco rigido e delle velocità di lettura; questo non era vero. Ho ritestato il mio programma che legge ogni file in blocchi di 4096 byte e poi confronta i blocchi - questo metodo è leggermente più veloce complessivo di MD5 anche quando i file sono esattamente gli stessi, e ovviamente saranno molto più veloci se differiscono.

Sto lasciando questa risposta come un leggero avvertimento circa la classe FileStream, e poiché penso ancora abbia qualche valore come risposta a "come faccio a calcolare l'MD5 di un file in .NET". A parte questo, però, non è il modo migliore per soddisfare la richiesta originale.

esempio di calcolo del hash MD5 dei due file (Testato!):

using (var reader1 = new System.IO.FileStream(filepath1, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
{ 
    using (var reader2 = new System.IO.FileStream(filepath2, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
    { 
     byte[] hash1; 
     byte[] hash2; 

     using (var md51 = new System.Security.Cryptography.MD5CryptoServiceProvider()) 
     { 
      md51.ComputeHash(reader1); 
      hash1 = md51.Hash; 
     } 

     using (var md52 = new System.Security.Cryptography.MD5CryptoServiceProvider()) 
     { 
      md52.ComputeHash(reader2); 
      hash2 = md52.Hash; 
     } 

     int j = 0; 
     for (j = 0; j < hash1.Length; j++) 
     { 
      if (hash1[j] != hash2[j]) 
      { 
       break; 
      } 
     } 

     if (j == hash1.Length) 
     { 
      Console.WriteLine("The files were equal."); 
     } 
     else 
     { 
      Console.WriteLine("The files were not equal."); 
     } 
    } 
} 
+4

Sebbene questo codice sia "più breve", è certamente molto più lento e generalmente peggiore del confronto byte per byte. Per non parlare di MD5 è un hash morto (crittograficamente parlando). Non lo farei davvero, se vuoi solo verificare che i file siano uguali. –

+1

@silky: Sospetto che ciò dipenda dalla dimensione dei file e dal fatto che il caso d'uso abbia una maggiore probabilità che siano equivalenti o meno, ma il calcolo degli MD5 di due file è tre volte più veloce rispetto al confronto dei loro byte byte per byte. – Coxy

+7

@silky: MD5 essendo un hash morto crittograficamente ha poco a che fare con il suo utilizzo come hash di confronto per un file di grandi dimensioni. – Tanzelax

2

Infatti c'è. Aprire entrambi i file, leggerli come array di byte e confrontare ciascun byte. Se sono uguali, il file è uguale.

8

Per prima cosa confrontare le dimensioni dei file, se la dimensione non è la stessa, i file sono diversi, se la dimensione è la stessa, è sufficiente confrontare il contenuto dei file.

Problemi correlati