Я хочу синхронизировать две директории. И я пользуюсь
file_get_contents($source) === file_get_contents($dest)
сравнить два файла. Есть ли проблемы, чтобы сделать это?
Я хочу синхронизировать две директории. И я пользуюсь
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, но это даст вам гарантированные результаты, даже если изменился только один бит.
Ths будет работать, но по своей сути более неэффективен, чем вычисление контрольной суммы для обоих файлов и их сравнение. Хорошими кандидатами для алгоритмов контрольной суммы являются SHA1 и MD5.
if (sha1_file($source) == sha1_file($dest)) {
/* ... */
}
Кажется немного тяжелым. Это будет загружать оба файла полностью как строки, а затем сравнивать.
Я думаю, вам может быть лучше открыть оба файла вручную и пометить их, возможно, сначала выполнить проверку размера файла.
Нет ничего плохого в том, что вы здесь делаете, примите его немного неэффективно. Получая содержимое каждого файла и сравнивая его, особенно с большими файлами или двоичными данными, вы можете столкнуться с проблемами.
Я бы посмотрел на filetime (последнее изменение) и filesize и запустите несколько тестов, чтобы убедиться, что это работает для вас. Это должно быть все, что вам нужно, на долю вычислительной мощности.
Сначала отметьте очевидное:
(добавьте сравнение даты, имени файла и других метаданных в этот очевидный список, если они также не должны быть похожими).
При сравнении хеширования содержимого не очень эффективно, как @Oli говорит в своем комментарии. Если, файлы отличаются, они скорее всего будут отличаться уже в начале. Вычисление хэша двух файлов 50 Мбайт, а затем сравнение хэша звучит как пустая трата времени, если второй бит уже отличается...
Отметьте этот пост на php.net
. Выглядит очень похоже на на @Svish, но также сравнивает файл mime-type
. Приятное дополнение, если вы спросите меня.
Но, сравнивая размер файла, вы не можете исправить этот файл или нет. Потому что может быть случай, когда размер файла остается таким же, но содержимое файла может быть изменено.
Нет, это должно работать