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

时间:2010-06-17 08:41:14

标签: php

我想同步两个目录。我用

file_get_contents($source) === file_get_contents($dest)

比较两个文件。这样做有什么问题吗?

8 个答案:

答案 0 :(得分:23)

我宁愿做这样的事情:

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可能是一个好主意,但这需要通过整个文件来创建该哈希。如果这个哈希是可以存储并在以后使用的东西,那么它可能是一个不同的故事,但是是啊......

答案 1 :(得分:19)

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

您还可以考虑其他方法,例如比较filemtime或文件大小,但即使只有一位被更改,这也会为您提供有保证的结果。

答案 2 :(得分:5)

  • 记忆:例如你有32 MB的内存限制,每个文件是20 MB。尝试分配内存时出现无法恢复的致命错误。这可以通过用较小的部分检查文件来解决。
  • 速度:字符串比较不是世界上最快的东西,计算sha1哈希应该更快(如果你想要110%肯定,你可以在哈希匹配时逐字节比较文件,但你'将排除内容和散列更改的所有情况(99%+个案))
  • 效率:做一些初步检查 - 例如如果它们的大小不同,那么比较两个文件是没有意义的。

答案 3 :(得分:2)

这会起作用,但本质上比计算两个文件的校验和并比较它们的效率更低。校验和算法的优秀候选者是SHA1和MD5。

http://php.net/sha1_file

http://php.net/md5_file

if (sha1_file($source) == sha1_file($dest)) {
    /* ... */
}

答案 4 :(得分:1)

似乎有点沉重。这将完全将两个文件作为字符串加载,然后进行比较。

我认为你可能最好手动打开这两个文件并勾选它们,也许只是先进行文件大小检查。

答案 5 :(得分:1)

你在这里做的事情没有任何问题,接受它的效率有点低。获取每个文件的内容并进行比较,特别是对于较大的文件或二进制数据,可能会遇到问题。

我会看看filetime(上次修改)和filesize,并运行一些测试,看看它是否适合您。它应该只需要一小部分计算能力。

答案 6 :(得分:1)

首先检查明显的:

  1. 比较尺寸
  2. 比较文件类型(mime-type)。
  3. 比较内容
  4. (将日期,文件名和其他元数据的比较添加到这个明显的列表中,如果它们也不应该相似)。

    比较内容哈希声音效率不是很高@Oli says in his comment 如果 文件不同, 很可能 在开头就已经不同了。如果第二位已经不同,计算两个50 Mb文件的散列然后比较散列声音就像浪费时间一样......

    检查this post on php.net。看起来与that of @Svish非常相似,但它也会比较文件mime-type。如果你问我一个聪明的补充。

答案 7 :(得分:0)

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

所以首先 - 你需要得到你要使用的所有文件的列表 如果你想做文件大小类型的事情 - 然后使用 COMPLETE / 字符串作为数组的键,然后存储文件大小()信息。然后对数组进行排序,以便将所有大小相同的文件排成一行。然后你可以检查文件大小。但是 - 这并不意味着它们真的相同 - 只是它们的大小相同。

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

我为什么要评论?我正在解决同样的问题,但我刚刚发现我的程序无法正常工作。所以现在我要使用 sha1_file() 函数来修正它。 :-)