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

问题描述 投票:19回答:7

我想同步两个目录。而我用

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

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

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

19
投票

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

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


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

2
投票

这将是有效的,但本质上比计算两个文件的校验和并比较它们更低效。校验和算法的良好候选者是SHA1和MD5。

http://php.net/sha1_file

http://php.net/md5_file

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

1
投票

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

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


1
投票

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

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


1
投票

首先检查明显的:

  1. 比较大小
  2. 比较文件类型(mime-type)。
  3. 比较内容。

(将日期,文件名和其他元数据的比较添加到这个明显的列表中,如果它们也不应该相似)。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.