我想同步两个目录。我用
file_get_contents($source) === file_get_contents($dest)
比较两个文件。这样做有什么问题吗?
答案 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;
}
检查文件大小是否相同,如果是,则逐步浏览文件。
答案 1 :(得分:19)
请改用sha1_file()
。如果您只是需要查看文件是否不同,它会更快并且工作正常。如果文件很大,则将整个字符串相互比较可能非常繁重。当sha1_file()
返回文件的40个字符表示时,比较文件将非常快。
您还可以考虑其他方法,例如比较filemtime
或文件大小,但即使只有一位被更改,这也会为您提供有保证的结果。
答案 2 :(得分:5)
答案 3 :(得分:2)
这会起作用,但本质上比计算两个文件的校验和并比较它们的效率更低。校验和算法的优秀候选者是SHA1和MD5。
if (sha1_file($source) == sha1_file($dest)) {
/* ... */
}
答案 4 :(得分:1)
似乎有点沉重。这将完全将两个文件作为字符串加载,然后进行比较。
我认为你可能最好手动打开这两个文件并勾选它们,也许只是先进行文件大小检查。
答案 5 :(得分:1)
你在这里做的事情没有任何问题,接受它的效率有点低。获取每个文件的内容并进行比较,特别是对于较大的文件或二进制数据,可能会遇到问题。
我会看看filetime(上次修改)和filesize,并运行一些测试,看看它是否适合您。它应该只需要一小部分计算能力。
答案 6 :(得分:1)
首先检查明显的:
(将日期,文件名和其他元数据的比较添加到这个明显的列表中,如果它们也不应该相似)。
比较内容哈希声音效率不是很高@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() 函数来修正它。 :-)