delphi сравнивает содержимое текстового файла - PullRequest
4 голосов
/ 03 июня 2011

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

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

//Use madZIP to calculate the CRC fior this file
GetUncompressedFileInfo(Filename_1, Size_1, NewCRC);

//Use madZIP to calculate the CRC fior this file
GetUncompressedFileInfo(Filename_2, Size_2, OldCRC);

//if ThisFileHash = ExistingFileHash then
if (OldCRC <> NewCRC) then
  CreateABackup;

С уважением, Питер.

Ответы [ 4 ]

7 голосов
/ 03 июня 2011

CRC не является безопасным методом обнаружения изменений в файлах - криптографические хеши (например, MD5 или SHA1) намного лучше.

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

2 голосов
/ 03 июня 2011

CRC, вероятно, более точный и довольно эффективный. Однако вам нужно проверить содержимое?

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

1 голос
/ 03 июня 2011

Вам также следует рассмотреть возможность использования инкрементного резервного копирования.

Я опубликовал некоторые оптимизированные функции управления версиями файлов для нашего SynProject инструмента с открытым исходным кодом. Класс TVersions в модуле ProjectVersioning позволяет хранить двоичные файлы diff внутри zip-контейнера.

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

Смотри, например, TVersions.FillStrings метод получения списка файлов для обновления.

Имейте в виду, что вы можете обнаружить разницу в один час, в зависимости от текущего летнего времени. Вот как мы разрешаем сравнение по дате:

function SameFileDateWindows(FileDate1,FileDate2: integer): boolean;
// we allow an exact one Hour round (NTFS bug on summer time zone change)
begin
  dec(FileDate1,FileDate2);
  result := (FileDate1=0) or (FileDate1=1 shl 11) or (FileDate1=-(1 shl 11));
end;

Мы не читаем содержимое файла здесь. Для целей резервного копирования достаточно полагаться на дату файла, чтобы пометить файл для сравнения. Затем выполняется дифференциальный дифференциал для обеих версий файла. Если содержимое файла одинаковое, в нем будет храниться только разница дат.

ИМХО, вам не следует использовать проприетарный контейнер madzip, а стандартный, такой как .zip. Их несколько, включая нашу версию, используемую в SynProject или в нашем ORM. Это быстрее, чем MadZip, и распаковка оптимизирована. См. SynZip модуль для низкоуровневого сжатия и простого читателя и записи .zip, а также более развитые классы в SynZipFiles (используется в SynProject). Для чистой версии Delphi, например madzip, проверьте модуль PasZip , который работает быстрее, чем madzip (но PasZip не будет компилироваться с Unicode Delphi, а SynZip -).

0 голосов
/ 03 июня 2011

На самом деле рекомендуется хранить для хранения хэшей содержимого (например, CRC-32 или любой другой хэш-функции) и размеры файлов ,Это повысит надежность на величину.RE: для хранения - нет необходимости вычислять хэш для содержимого, о котором известно, что оно не изменялось более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...