Intereting Posts
Почему in_array () возвращает неожиданные / странные результаты? Как я могу использовать различные XML-библиотеки PHP для получения DOM-подобных функций и предотвращения уязвимостей DoS, таких как Billion Laughs или Quadratic Blowup? Не удается получить доступ к файлам php, скопированным в / var / www / или другие папки Как получить текущее название маршрута в laravel 5? Как я могу объединиться с PHP и Dot Net Database jqGrid не может встроить редактирование Перенаправление с помощью cURL? PHP Предупреждение: запуск PHP: ????????: невозможно инициализировать модуль htaccess ErrorDocument 404 перенаправление не работает Должен ли я создать объект или работать с массивом? Как загрузить файл с PHP, curl и HTTP POST путем потоковой передачи файла? PHP mail () работает из командной строки, но не apache Symfony2: после успешного входа в систему выполните ряд действий Проблемы с синтаксисом PHP PHP: проблема отправки формы в AJAX / JSON?

Могу ли я использовать file_get_contents () для сравнения двух файлов?

Я хочу синхронизировать два каталога. И я использую file_get_contents ($ source) === file_get_contents ($ dest) для сравнения двух файлов. Есть ли какие-либо проблемы для этого?

Related of "Могу ли я использовать file_get_contents () для сравнения двух файлов?"

Я бы предпочел сделать что-то вроде этого:

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 или md5 может быть хорошей идеей, но для этого требуется пройти весь файл, чтобы создать этот хеш. Если этот хэш – это то, что можно было бы сохранить и использовать позже, значит, это совсем другая история, но да …

sha1_file() этого используйте sha1_file() . Это быстрее и работает отлично, если вам просто нужно посмотреть, отличаются ли файлы. Если файлы большие, сравнение целых строк друг с другом может быть очень тяжелым. Поскольку sha1_file() возвращает 40-символьное представление файла, сравнение файлов будет очень быстрым.

Вы также можете рассмотреть другие методы, такие как сравнение filemtime или файлов, но это даст вам гарантированные результаты, даже если есть только один бит, который был изменен.

  • Память: например, у вас есть ограничение на 32 МБ памяти, а файлы по 20 МБ каждый. Неустранимая фатальная ошибка при попытке выделить память. Это можно решить, проверяя файлы на более мелкие части.
  • Скорость: сравнение строк не самая быстрая вещь в мире, вычисление хэша sha1 должно быть быстрее (если вы хотите быть уверенным на 110%, вы можете сравнивать файлы побайтно, когда хеш совпадает, но вы будете исключать все случаи изменения содержимого и хэша (99% + случаи))
  • Эффективность: выполните некоторые предварительные проверки – например, нет смысла сравнивать два файла, если их размер отличается.

Кажется немного тяжелым. Это будет загружать оба файла полностью как строки, а затем сравнивать.

Я думаю, вам может быть лучше открыть оба файла вручную и пометить их, возможно, сначала выполнить проверку размера файла.

Нет ничего плохого в том, что вы здесь делаете, примите его немного неэффективно. Получая содержимое каждого файла и сравнивая его, особенно с большими файлами или двоичными данными, вы можете столкнуться с проблемами.

Я хотел бы взглянуть на файл (последнее изменение) и размер файла и запустить несколько тестов, чтобы убедиться, что это работает для вас. Это должно быть все, что вам нужно, на долю вычислительной мощности.

Ths будет работать, но по своей сути более неэффективен, чем вычисление контрольной суммы для обоих файлов и их сравнение. Хорошими кандидатами для алгоритмов контрольной суммы являются SHA1 и MD5.

http://php.net/sha1_file

http://php.net/md5_file

 if (sha1_file($source) == sha1_file($dest)) { /* ... */ } 

Нет, это должно работать

Но, сравнивая размер файла, вы не можете исправить этот файл или нет. Потому что может быть случай, когда размер файла остается таким же, но содержимое файла может быть изменено.

Сначала проверьте очевидность:

  1. Сравнить размеры
  2. Сравните тип файла (mime-type).
  3. Сравните контент .

(добавьте сравнение даты, имени файла и других метаданных в этот очевидный список, если они также не должны быть похожими).

Когда сравнение хэширования контента не очень эффективно, как говорит @Oli в своем комментарии . Если файлы разные, они, скорее всего, будут отличаться уже в начале. Вычисление хэша из двух файлов размером 50 Мбайт, а затем сравнение хэша звучит как пустая трата времени, если второй бит уже отличается …

Проверьте это сообщение на php.net . Выглядит очень похоже на @Svish, но также сравнивает файл mime-type . Разумное дополнение, если вы спросите меня.