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.");
}
}
}
vuoi fare questo a livello di codice, altrimenti questo sarebbe più adatto a SuperUser.com? – cjk
sì, sto creando un piccolo programma per eliminare i duplicati. – Michel