Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Как проверить изменился ли файл?

#сеть #delphi #файлы


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

Сейчас все делаю через таймер и FileDateToDateTime(). Клиентов не больше 20ти, но
меня все же мучает вопрос - не скажется ли такой метод на производительности и надежности
сетевого хранилища? Насколько вредны постоянные запросы?

Как этот же функционал можно реализовать более правильно?

p.s.: Вариант с клиент-серверным приложением самый-самый крайний, т.к. для него в
офисе нет отдельной машины, да и начальство не будет в восторге от такой идеи.

Update
После многочисленных экспериментов решил отказаться от идеи отслеживания файлов в
пользу UDP Broadcast. Т.к. изменение файлов происходит в приложениях-клиентах, то я
сразу отправляю пакет другим клиентам. Пока что отправляю только уведомление, что что-то
поменялось, но, в последствии, переделаю с указанием точного адреса файла.
    


Ответы

Ответ 1



Я считаю, что самый лучший вариант в данном случае, это сверять хэш файла. Я делал приложение такое на шарпе. Был сервер, на котором хранился файл программы, который постоянно обновлялся. И было порядка 10-ти машин, на которых приходилось постоянно обновлять файл. Решил облегчить себе работу, и всё это автоматизировать. Идея была следующей: у каждого клиента, в трее висит программа, которая через определённый интервал времени должна была каким - то образом проверять, не изменился ли файл. Изначально, мысль была сделать проверку по дате изменения файла, но сказать честно, этот вариант отпал сразу, ибо не всегда при замене(программно во всяком случае) файла, меняется дата его последнего обновления. Решил сделать следующим образом: Программа при первом запуске записывала в ini файл хеш нужного файла, и в последствии, через какой - то интервал времени сравнивала текущий хэш файла, с тем, что был записал в ini файл. ) Если изменений нет - молчим. Если есть - выводим сообщение, где пользователю предлагается обновить файл. ) Работает отлично. Бегать больше не приходилось. )

Ответ 2



SMB кеширует запросы к статистике файла, в том числе к mtime, так что сильно переживать за нагрузку не надо :)

Ответ 3



Если надо получать точные сведения - какой файл или папка изменён, какие изменения с ним произошли и в какой последовательности - для этого надо применять механизм, построенный на вызовах функций: CreateFile(), ReadDirectoryChangesW(), CloseHandle(). Пример использования на Delphi можно найти здесь.

Ответ 4



Могу предложить еще вариант: Монтировать сетевую папку как диск и попробовать отслеживать изменения как в локальной директории. Но за работоспособность не ручаюсь.

Ответ 5



А почему бы не использовать FileSystemWatcher из System.IO из .NET. Можно отслеживать изменение файла и каталога хоть по сети. Тем более есть Delphi.NET

Комментариев нет:

Отправить комментарий