C# 比较C语言中的两个文件#

C# 比较C语言中的两个文件#,c#,.net,file,compare,C#,.net,File,Compare,我想比较C#中的两个文件,看看它们是否不同。它们具有相同的文件名,不同时大小完全相同。我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 谢谢 我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件 不是真的 如果文件带有散列,您可以比较散列,如果它们不同,您可以得出文件不同的结论(但是,相同的散列并不意味着文件相同,因此您仍然需要逐个字节进行比较) 但是,哈希使用文件中的所有字节,因此无论发生什么情况,您都必须在某个时刻逐字节读取文件。事实上,仅仅一个字

我想比较C#中的两个文件,看看它们是否不同。它们具有相同的文件名,不同时大小完全相同。我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件

谢谢

我只是想知道是否有一种快速的方法可以做到这一点,而不必手动进入并读取文件

不是真的

如果文件带有散列,您可以比较散列,如果它们不同,您可以得出文件不同的结论(但是,相同的散列并不意味着文件相同,因此您仍然需要逐个字节进行比较)

但是,哈希使用文件中的所有字节,因此无论发生什么情况,您都必须在某个时刻逐字节读取文件。事实上,仅仅一个字节一个字节的比较比计算一个散列要快。这是因为散列读取所有字节就像逐字节比较一样,但散列会进行其他一些增加时间的计算。此外,逐字节比较可以在第一对不相等字节上提前终止


最后,您无法避免逐字节读取的需要。如果散列相等,这并不意味着文件相等。在这种情况下,您仍然需要逐字节比较。

如果文件名相同,并且文件大小相同,那么,不,不检查内容就无法知道它们是否有不同的内容。

如果它们不是符合要求的文件,则使用类似KDiff或WinMerge的差异工具。如果它们不同的话,它将突出显示


嗯,我不确定您是否可以在文件中写入时间戳。如果不是,您唯一的选择是比较文件的内容

一种简单的方法是逐字节比较文件,但是如果要将一个文件与其他文件进行多次比较,可以计算文件的哈希代码并进行比较

以下代码段显示了如何执行此操作:

    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);
    }

如果要将一个文件与其他文件进行多次比较,可以保存文件哈希并进行比较。对于单个比较,字节到字节的比较更好。当文件更改时,您还需要重新计算哈希值,但是如果您要进行大量比较(不止一次),我建议使用哈希方法。

将每个文件流通过MD5哈希器并比较哈希值。

根据您希望进行的比较程度,您可以查看

下面是一个简单的文件比较函数:

// 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);
}

将文件读入流,然后对流进行散列。这会给你一个可靠的比较结果

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; 
        }
    }
字节[]fileHash1,fileHash2; 使用(SHA256Managed sha=new SHA256Managed()) { fileHash1=sha.ComputeHash(streamforfile1); fileHash2=sha.ComputeHash(streamforfile2); } 对于(inti=0;(i但是如果散列值相等,您仍然需要手动读取文件并逐字节比较,以得出它们实际上相等的结论。这是一项相当艰巨的工作。您无法避免进行逐字节比较的需要。编程工作量更少。CPU还没有感知能力,所以谁在乎它是否需要做额外的工作。现代的CPU速度很快,除非你在短时间内做了大量的工作,否则你不会注意到额外的工作。但是OP没有指出情况是这样的。你没有注意到:如果散列相等,你仍然需要逐字节比较。使用散列不是更少的工作,而是更多的工作,因为您必须编写逐字节比较和代码来使用散列算法,以及在散列相等时使用逐字节逻辑。不,这意味着它们具有相同的散列。它并不“意味着文件是相同的”十六进制代码
d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55AD340609F4B30283E4888832571415A 085125e8f7cdc99fd91dbdf280373c5b D8823E31563448F5BAE6DACD436C919C65 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e C69821BCB88396F96526A70
2fcab50712467eab4004583eb8fb7f89 55AD340609F4B30283E488325F1415A 085125e8f7cdc99fd91dbd7280373c5b D8823E31563448F5BAE6DACD436C919C6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e C69821BCB6A88396F965FF72A70具有相同的md5哈希。它们不相等。如果文件仅更改了一个字符,则此操作将不起作用。流的长度应该是相同的,但内容不同。这是无效的!这实际上是从微软的网站上获取的。它执行相等比较、长度比较和逐字节比较。我想你可能错了。对不起,我不想显得粗鲁:-)问题是“它们有相同的文件名,不同的时候大小完全相同”。因此,这种方法容易出错。我们开发了一个版本控制系统,这种实现方式可能会在SCM数据库中造成灾难。@Daniel:很抱歉重提一篇旧文章,但是你能解释一下代码的实际问题吗?对我来说似乎没问题,它是检查文件大小,然后逐字节检查。一个字符的差异怎么能逃脱检查呢?格雷西亚斯!代码是正确的,但您必须向下滚动才能看到进行逐字节比较的位。我想丹尼尔没有向下滚动。我和杰森在一起:请在你向下投票时发表评论。这个答案虽然简短,但(目前)是这个帖子中唯一正确的答案。它不应该被否决,不!如果散列相等,您仍然必须逐字节比较。如果散列是不相等的,则逐字节执行会更快,因为它可以在第一对不相等的字节上提前终止,但散列必须贯穿整个文件!啊!如果你有两个文件可用