【发布时间】:2010-06-17 08:41:13
【问题描述】:
我想同步两个目录。我使用
file_get_contents($source) === file_get_contents($dest)
比较两个文件。这样做有什么问题吗?
【问题讨论】:
-
如果文件通过服务器上的一个进程,也许这些进程可以在每次添加或修改文件时生成一个哈希,这样你只需要比较哈希就知道要同步什么
标签: php
我想同步两个目录。我使用
file_get_contents($source) === file_get_contents($dest)
比较两个文件。这样做有什么问题吗?
【问题讨论】:
标签: php
我宁愿做这样的事情:
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;
}
这会检查文件大小是否相同,如果是,则逐步遍历文件。
【讨论】:
$bh 大于$ah,它不是已经返回了false 几行吗?
请改用sha1_file()。如果您只需要查看文件是否不同,它会更快并且工作正常。如果文件很大,则将整个字符串相互比较可能会非常繁重。由于sha1_file() 返回文件的 40 个字符表示,比较文件会非常快。
您也可以考虑其他方法,例如比较 filemtime 或文件大小,但即使只有一点点更改,这也能保证结果。
【讨论】:
sha1_file() 必须散列整个文件。当然它并不比手动比较快。
【讨论】:
这会起作用,但本质上比计算两个文件的校验和并比较它们效率低下。适合校验和算法的候选者是 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。如果你问我,这是一个聪明的补充。
【讨论】:
我注意到缺少 N!因素。换句话说 - 要执行 filesize() 函数,您首先必须对照所有其他文件检查每个文件。为什么?如果第一个文件和第二个文件大小不同但第三个文件大小相同怎么办。
所以首先 - 你需要得到一个你将要使用的所有文件的列表如果你想做文件大小类型的事情 - 然后使用 COMPLETE / 字符串作为数组的键,然后存储文件大小()信息。然后对数组进行排序,使所有大小相同的文件排成一行。然后你可以检查文件大小。但是 - 这并不意味着它们真的是相同的 - 只是它们的大小相同。
您需要执行 sha1_file() 命令之类的操作,并像上面一样创建一个数组,其中键是 / 名称是键,值是返回的值。对它们进行排序,然后简单地遍历存储要测试的 sha1_file() 值的数组。那么A == B吗?是的。进行任何其他测试,然后删除 SECOND 文件并继续。
我为什么要评论?我正在解决同样的问题,我刚刚发现我的程序无法正常工作。所以现在我要使用 sha1_file() 函数来纠正它。 :-)
【讨论】: