web-dev-qa-db-fra.com

Comparer deux fichiers en C #

Je veux comparer deux fichiers en C # et voir s'ils sont différents. Ils ont les mêmes noms de fichiers et ils ont exactement la même taille lorsqu'ils sont différents. Je me demandais s'il existe un moyen rapide de le faire sans avoir à entrer manuellement et à lire le fichier.

Merci 

15
Toz

En fonction de votre objectif, vous pouvez consulter Diff.NET

Voici une fonction simple de comparaison de fichiers:

// This method accepts two strings the represent two files to 
// compare. A return value of 0 indicates that the contents of the files
// are the same. A return value of any other value indicates that the 
// files are not the same.
private bool FileCompare(string file1, string file2)
{
     int file1byte;
     int file2byte;
     FileStream fs1;
     FileStream fs2;

     // Determine if the same file was referenced two times.
     if (file1 == file2)
     {
          // Return true to indicate that the files are the same.
          return true;
     }

     // Open the two files.
     fs1 = new FileStream(file1, FileMode.Open, FileAccess.Read);
     fs2 = new FileStream(file2, FileMode.Open, FileAccess.Read);

     // Check the file sizes. If they are not the same, the files 
        // are not the same.
     if (fs1.Length != fs2.Length)
     {
          // Close the file
          fs1.Close();
          fs2.Close();

          // Return false to indicate files are different
          return false;
     }

     // Read and compare a byte from each file until either a
     // non-matching set of bytes is found or until the end of
     // file1 is reached.
     do 
     {
          // Read one byte from each file.
          file1byte = fs1.ReadByte();
          file2byte = fs2.ReadByte();
     }
     while ((file1byte == file2byte) && (file1byte != -1));

     // Close the files.
     fs1.Close();
     fs2.Close();

     // Return the success of the comparison. "file1byte" is 
     // equal to "file2byte" at this point only if the files are 
     // the same.
     return ((file1byte - file2byte) == 0);
}
27
James Johnson

Je me demandais s'il existe un moyen rapide de le faire sans avoir à entrer manuellement et à lire le fichier.

Pas vraiment.

Si les fichiers sont livrés avec des hachages, vous pouvez comparer les hachages. S'ils sont différents, vous pouvez en conclure que les fichiers sont différents (le même hachage ne signifie cependant pas que les fichiers sont identiques et vous devrez faire une comparaison octet par octet).

Toutefois, les hachages utilisent tous les octets du fichier. Par conséquent, vous devez, à tout moment, lire octet par octet. Et en fait, une comparaison simple, octet par octet, sera plus rapide que de calculer un hachage. En effet, un hachage lit tous les octets, tout comme la comparaison octet par octet. Cependant, le hachage effectue d'autres calculs qui ajoutent du temps. En outre, une comparaison octet par octet peut se terminer plus tôt sur la première paire d'octets non égaux.

Enfin, vous ne pouvez pas éviter la nécessité d’une lecture octet par octet. Si les hachages sont égaux, cela ne signifie pas que les fichiers sont égaux. Dans ce cas, vous devez encore comparer octet par octet.

18
jason

Eh bien, je ne sais pas si vous pouvez dans le fichier écrire des horodatages. Sinon, votre alternative unique consiste à comparer le contenu des fichiers. 

Une approche simple consiste à comparer les fichiers octet par octet, mais si vous comparez plusieurs fois un fichier avec d'autres, vous pouvez calculer le hashcode des fichiers et le comparer.

L'extrait de code suivant montre comment vous pouvez le faire:

    public static string CalcHashCode(string filename)
    {
        FileStream stream = new FileStream(
            filename,
            System.IO.FileMode.Open,
            System.IO.FileAccess.Read,
            System.IO.FileShare.ReadWrite);

        try
        {
            return CalcHashCode(stream);
        }
        finally
        {
            stream.Close();
        }
    }

    public static string CalcHashCode(FileStream file)
    {
        MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
        Byte[] hash = md5Provider.ComputeHash(file);
        return Convert.ToBase64String(hash);
    }

Si vous comparez un fichier avec d'autres fichiers plusieurs fois, vous pouvez enregistrer le hachage de fichier et le comparer. Pour une comparaison unique, la comparaison octet par octet est meilleure. Vous devez également recalculer le hachage lorsque le fichier est modifié, mais si vous souhaitez effectuer des comparaisons massives (plus d'une fois), je vous recommande d'utiliser l'approche de hachage.

4
Daniel Peñalba

Si les noms de fichiers sont identiques et que la taille des fichiers est identique, il est impossible de savoir s'ils ont un contenu différent sans en examiner le contenu.

3
AllenG

Lisez le fichier dans un flux, puis hachez le flux. Cela devrait vous donner un résultat fiable pour la comparaison.

byte[] fileHash1, fileHash2;

using (SHA256Managed sha = new SHA256Managed())
{
    fileHash1 = sha.ComputeHash(streamforfile1);
    fileHash2 = sha.ComputeHash(streamforfile2);
}

for (int i = 0; (i < fileHash1.Length) && (i < fileHash2.Length); i++)
    {
        if (fileHash[i] != fileHash2[i]) 
        { 
             //files are not the same
             break; 
        }
    }
0
Random