Подтвердить что ты не робот

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

Я хочу синхронизировать две директории. И я пользуюсь

file_get_contents($source) === file_get_contents($dest)

сравнить два файла. Есть ли проблемы, чтобы сделать это?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

http://php.net/sha1_file

http://php.net/md5_file

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Сначала отметьте очевидное:

  • Сравните размер
  • Сравните тип файла (тип mime).
  • Сравните содержимое.

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

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

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

Ответ 8

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

Ответ 9

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