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