Сканирование на наличие измененных файлов - PullRequest
1 голос
/ 03 ноября 2010

Я ищу хороший эффективный метод сканирования структуры каталогов для измененных файлов в Windows XP +.Что-то вроде того, как git делает это именно то, что я ищу: при запуске git status он отображает все измененные файлы, все новые (неотслеживаемые) и удаленные файлы очень быстро, и это именно то, что я хотел бы сделать.

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

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

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

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

Спасибо, J

РЕДАКТИРОВАТЬ: Я думаю, что я, возможно, описал проблему плохо.Проблема, с которой я сталкиваюсь, заключается не столько в обнаружении изменений - я ReadDirectoryChangesW() использую IOCP в нескольких потоках, чтобы обнаружить, когда происходит изменение, проблема больше в том, что делать с информацией.Например, перемещенный файл сообщается как удаление, за которым следует создание, а переименование состоит из двух частей: старое имя, за которым следует новое имя.Итак, я спрашиваю, как провести различие между удалением как частью перемещения и фактическим удалением.Я полагаю, что буферизация изменений и обработка пакетов будет возможной, но она выглядит грязной.

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

В собственном коде FileSystemWatcher заменяется на ReadDirectoryChangesW .Правильное использование этого не просто, есть хорошая базовая линия для построения здесь .

Я использовал этот код в предыдущей работе, и он работал довольно хорошо.Сам Win32 API (и FileSystemWatcher) подвержены проблемам, которые описаны в документах, а также обсуждаются в различных местах в Интернете, но влияние этих факторов будет зависеть от ваших вариантов использования.указывается в возвращаемой структуре FILE_NOTIFY_INFORMATION - добавляет, удаляет, переименовывает данные, включая старое и новое имя.

2 голосов
/ 03 ноября 2010

Я проголосовал за Ливиу М. up. Однако другой вариант, если вы по какой-то причине не хотите использовать .NET Framework, это использовать базовый вызов Win32 API FindFirstChangeNotification .

1 голос
/ 03 ноября 2010

Вы можете использовать ведение журнала USN, если хотите, это довольно низкий уровень (уровень NTFS).

Здесь вы можете найти подробную информацию и исходный код. Он написан на C #, но в основном это функции PInvoking C / C ++.

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