我想同步两个目录。而我用
file_get_contents($source) === file_get_contents($dest)
比较两个文件。这样做有什么问题吗?
我宁愿做这样的事情:
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_file()
。如果您只是需要查看文件是否不同,它会更快并且工作正常。如果文件很大,则将整个字符串相互比较可能非常繁重。由于sha1_file()
返回文件的40个字符表示,比较文件将非常快。
您还可以考虑其他方法,例如比较filemtime
或filesize,但即使只有一个位被更改,这也会为您提供有保证的结果。
这将是有效的,但本质上比计算两个文件的校验和并比较它们更低效。校验和算法的良好候选者是SHA1和MD5。
if (sha1_file($source) == sha1_file($dest)) {
/* ... */
}
看起来有点沉重。这将完全将两个文件作为字符串加载,然后进行比较。
我认为你可能最好手动打开这两个文件并勾选它们,也许只是先进行文件大小检查。
首先检查明显的:
(将日期,文件名和其他元数据的比较添加到这个明显的列表中,如果它们也不应该相似)。
比较内容哈希声音不像@Oli says in his comment那样高效。如果文件不同,它们很可能在开头就已经不同了。如果第二位已经不同,计算两个50 Mb文件的哈希然后比较哈希声音就像浪费时间一样......
检查this post on php.net
。看起来非常类似于that of @Svish但它也比较文件mime-type
。如果你问我一个聪明的补充。