Php 我可以使用file_get_contents()来比较两个文件吗?

Php 我可以使用file_get_contents()来比较两个文件吗?,php,Php,我想同步两个目录。我用 file_get_contents($source) === file_get_contents($dest) 比较两个文件。这样做有什么问题吗?请改用。如果您只需要查看文件是否不同,它会更快,而且工作正常。如果文件很大,将整个字符串相互比较可能会非常繁重。由于sha1_file()返回文件的40个字符表示形式,因此比较文件将非常快 你也可以考虑其他方法,比如比较 FieldTime//>或FiSeSe],但是这会给你保证的结果,即使只有一个比特被改变了。看起来有点重。

我想同步两个目录。我用

file_get_contents($source) === file_get_contents($dest)
比较两个文件。这样做有什么问题吗?

请改用。如果您只需要查看文件是否不同,它会更快,而且工作正常。如果文件很大,将整个字符串相互比较可能会非常繁重。由于
sha1_file()
返回文件的40个字符表示形式,因此比较文件将非常快


你也可以考虑其他方法,比如比较<代码> FieldTime//>或FiSeSe],但是这会给你保证的结果,即使只有一个比特被改变了。

看起来有点重。这将以字符串形式完全加载这两个文件,然后进行比较


我认为您最好手动打开这两个文件并在它们之间打勾,也许只是先做一个文件大小检查。

您在这里所做的没有任何问题,请接受这有点低效。获取每个文件的内容并进行比较,尤其是与较大的文件或二进制数据进行比较时,可能会遇到问题


我将查看(上次修改)和,并运行一些测试,看看这是否适用于您。它应该是您所需要的全部,只需计算能力的一小部分。

Ths可以工作,但本质上比计算两个文件的校验和并比较它们效率更低。校验和算法的最佳候选是SHA1和MD5

  • 内存:例如,您有32 MB的内存限制,每个文件有20 MB。尝试分配内存时出现不可恢复的致命错误。这可以通过按较小的部分检查文件来解决
  • 速度:字符串比较不是世界上最快的事情,计算sha1哈希应该更快(如果你想110%确定,你可以在哈希匹配时逐字节比较文件,但你会排除所有内容和哈希变化的情况(99%+情况))
  • 效率:进行一些初步检查-例如,如果两个文件大小不同,则没有必要对其进行比较

    • 我宁愿做这样的事情:

      function files_are_equal($a, $b)
      {
        // Check if filesize is different
        if(filesize($a) !== filesize($b))
            return false;
      
        // Check if content is different
        $ah = fopen($a, 'rb');
        $bh = fopen($b, 'rb');
      
        $result = true;
        while(!feof($ah))
        {
          if(fread($ah, 8192) != fread($bh, 8192))
          {
            $result = false;
            break;
          }
        }
      
        fclose($ah);
        fclose($bh);
      
        return $result;
      }
      
      这将检查文件大小是否相同,如果相同,则一步一步地检查文件

      • 在某些情况下,检查修改的时间检查可能是一种快速的方法,但它不会真正告诉您除了文件在不同时间被修改之外的任何事情。它们可能仍然有相同的内容
      • 使用sha1或md5可能是个好主意,但这需要遍历整个文件来创建哈希。如果这个散列是可以存储并在以后使用的,那么它可能是另一个故事,但是是的

      首先检查明显的:

    • 比较大小
    • 比较文件类型(mime类型)
    • 比较内容
    • (将日期、文件名和其他元数据的比较添加到这个明显的列表中,如果它们不应该是相似的)

      当比较内容时,哈希听起来不是很有效如果文件不同,则它们很可能在开始时就不同了。计算两个50MB文件的散列,然后比较散列,如果第二位已经不同,听起来像是浪费时间


      检查。看起来非常类似,但它也比较了文件
      mime类型
      。若你们问我的话,这是一个聪明的补充。

      我注意到的一点是缺少N!因素换句话说,要执行filesize()函数,首先必须对照所有其他文件检查每个文件。为什么?如果第一个文件和第二个文件大小不同,但第三个文件大小相同,该怎么办

      因此,首先—如果要执行filesize类型的操作,您需要获取要处理的所有文件的列表—然后使用COMPLETE/string作为数组的键,然后存储filesize()信息。然后对数组进行排序,使所有大小相同的文件对齐。然后可以检查文件大小。然而,这并不意味着它们真的是一样的,只是它们的大小是一样的

      您需要执行类似于sha1_file()命令的操作,并且像上面一样,创建一个数组,其中键是/name是键,值是返回的值。对它们进行排序,然后只需对存储sha1_file()值的数组进行简单的遍历即可。那么A==B呢?对执行任何其他测试,然后删除第二个文件并继续


      我为什么要评论?我正在处理同一个问题,我刚刚发现我的程序工作不正常。现在我要用sha1_file()函数来纠正它。:-)

      +1用于文件大小检查。不过,如果有文本文件,请注意自动行尾转换,这可能会很麻烦。@Boldewyn:好的观点-Windows行尾是2字节,UNIX/Mac是1字节。然而,在这种情况下,这意味着其中一个文件已被更改(FTP除外,在FTP中会发生各种疯狂的事情)。这正是问题所在。如果其中一个文件夹位于执行行尾转换的管道的另一端,则所有文本文件都将始终不同。如果某个文件夹正在执行行尾转换,则我宁愿考虑修复该问题。如果两个文件除了行尾之外是相同的,我认为它们仍然应该被认为是不同的。@Svish:当然。不幸的是,FTP协议(这类问题的罪魁祸首)由于神秘的原因拒绝消亡——尽管它不安全并且充满了奇怪的怪癖。
      sha1_file()
      必须散列整个文件。当然,这并不比手动比较快。@奥利,我假设散列文件并将40个字符与其他40个字符进行比较比将整个文件内容相互比较快。我不确定这是一个公平的假设。假设您有两个文件,2M字符长,并且第一个字符不同。散列将读取4M个字符,构建两个散列,
      function files_are_equal($a, $b)
      {
        // Check if filesize is different
        if(filesize($a) !== filesize($b))
            return false;
      
        // Check if content is different
        $ah = fopen($a, 'rb');
        $bh = fopen($b, 'rb');
      
        $result = true;
        while(!feof($ah))
        {
          if(fread($ah, 8192) != fread($bh, 8192))
          {
            $result = false;
            break;
          }
        }
      
        fclose($ah);
        fclose($bh);
      
        return $result;
      }