2011-03-23 3 views
2

В настоящее время я проверяю контрольную сумму XOR с измененным временем файла (st_mtime из fstat) для каждого файла в дереве. Я связываю это с количеством найденных файлов и контрольной суммой размера файла (разрешая переполнение), но я вполне параноик, что это может и приведет к ложным срабатываниям в наиболее экстремальных патологических случаях.Каков самый быстрый способ проверить, изменились ли какие-либо файлы в дереве каталогов?

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

Итак, вопрос в том, какие у вас могут быть какие-то советы или рекомендации для определения того, был ли изменен какой-либо файл в дереве каталогов? Я бы хотел избежать побайтового сравнения, не отрывая слишком много надежды.

Большое спасибо за ваши предложения.

+0

Пока программа работает, или с момента последнего запуска? – tstenner

+0

tstenner: Если я правильно понял ваш вопрос с момента последнего запуска. Учитывая базу данных о файлах, я хочу знать, следует ли мне обновлять эту базу данных по истечении заданной продолжительности, используя только информацию базы данных в качестве ссылки. – SilentDirge

+0

По крайней мере, если вы хотите (вероятно) обнаружить пятна в коллекции данных, тогда возьмите правильную контрольную сумму набора данных, а не только XOR. Если вас беспокоит, может ли порядок, в котором файлы возвращаются 'readdir', может измениться, хотя файловая система не имеет, вы можете сначала отсортировать файлы в каждом каталоге (и отсортировать каталоги во время обхода). Например, предположим, что я удаляю два файла с одинаковой меткой времени и создаю два файла с другой меткой времени, совершенно правдоподобно, если они временные файлы. В метрике «количество файлов и XOR временных меток» это не указано. –

ответ

3

Вы можете использовать свойство «Последнее изменение», которое имеет файлы (независимо от платформы).

Просто храните исторические ценности и проверяйте исторические значения по текущим значениям, так часто.

boost :: filesystem имеет отличный API для перекрестной платформы для чтения этого значения.

EDIT: частности посмотреть на: http://www.pdc.kth.se/training/Talks/C++/boost/libs/filesystem/doc/operations.htm#last_write_time

+1

Зависит от того, насколько вы параноик. Большинство систем позволят вам установить последнюю измененную дату, поэтому вы не можете быть уверены, что она не была сброшена. – forsvarir

+0

Отличная идея, намного быстрее, чем CRC32. Сопоставляя имена файлов и добавляя mtime вместе с каждым отсортированным именем в последовательный поток файлов, я могу поймать любые изменения с помощью (надеюсь) быстрого memcmp! forsvarir: Я не слишком беспокоюсь о том, что пользователь сам модифицирует это значение, но хороший момент. – SilentDirge

+0

@Aureis: Это отличный способ сделать это! –

 Смежные вопросы

  • Нет связанных вопросов^_^