Рекурсивное использование ReadDirectoryChanges

Я хочу рекурсивно отслеживать все изменения в каталоге, т.е. если смотрю C:\, я хочу получать уведомления для

C:\1.txt
C:\A\1.txt

Если я использую ReadDirectoryChanges с включенной опцией watchSubtree, он сообщает только

C:\1.txt
C:\A

Он не работает рекурсивно.

Как я могу заставить его работать рекурсивно? Мне действительно нужно вызывать ReadDirectoryChangesдля каждого подкаталога рекурсивно? Что делать, если создаются новые подкаталоги / удаляются подкаталоги?

Спасибо за любую помощь.


person jpfollenius    schedule 30.05.2011    source источник
comment
@Smasher, функция ReadDirectoryChanges может работать рекурсивно, возможно, проблема в вашей реализации этой функции. Пожалуйста, поделитесь кодом, который вы используете, чтобы получить помощь.   -  person RRUZ    schedule 30.05.2011
comment
@RRUZ: Я был бы более чем счастлив, если бы ты был прав, но я так не думаю. Я использую код, опубликованный @mghie в этом ответе: readdirectorychanges опустить события"> stackoverflow.com/questions/863135/ Он также упоминает этот факт. Также эта статья в блоге qualapps.blogspot.com/2010/05/ утверждает это, но без решения, а также.   -  person jpfollenius    schedule 30.05.2011
comment
@RRUZ: просто для ясности: он ДЕЙСТВИТЕЛЬНО сообщает об изменении C:\A\1.txt, но имя файла в уведомлении C:\A, а не C:\A\1.txt.   -  person jpfollenius    schedule 30.05.2011
comment
Я ничего не вижу в этих статьях о том, что параметр bWatchSubtree не работает, за исключением того, что в ответе на переполнение стека упоминается предостережение об удалении файлов и о том, что вы не будете получать уведомления о каждом отдельном файле. Пожалуйста, дайте более подробную информацию о том, что не работает и что вы ожидали. Также обратите внимание на рекомендации против использования этого API для отслеживания изменений всего диска. Используйте для этого журнал изменений.   -  person Rob Kennedy    schedule 30.05.2011
comment
@Smasher попробуйте эту реализацию, я только что протестировал и работает нормально (это означает, что сообщает полное имя измененного файла), просто нужно несколько изменений, чтобы опустить предупреждения в delphi XE. просто совет, в прошлом у меня были проблемы (некоторые уведомления были потеряны), когда я пытался рекурсивно отслеживать корневую папку системы с помощью функции ReadDirectoryChanges. проверьте этот образец изображения, который показывает полное имя файла в уведомлениях dl.dropbox.com/u/ 12733424/MonitorDemo.png   -  person RRUZ    schedule 30.05.2011
comment
@Rob: упоминает предостережение об удалении файлов и о том, что вы не будете получать уведомления о каждом отдельном файле. Это именно то, что я имею в виду. Мне нужно уведомление для каждого отдельного файла. Я не планирую использовать это на всем диске. Это был просто (не очень удачный) пример.   -  person jpfollenius    schedule 30.05.2011
comment
@RRUZ: спасибо за ссылку и вашу помощь. Я попробую это, когда я вернусь к работе завтра.   -  person jpfollenius    schedule 30.05.2011
comment
Вы также можете посмотреть на мой компонент, который делает то же самое: cromis.net/blog/downloads /directory-watch Это нормально работает для меня в производственном коде.   -  person Runner    schedule 30.05.2011
comment
Спасибо вам всем! Я заработал. Если вы опубликуете свои ссылки в качестве ответа, я приму это.   -  person jpfollenius    schedule 31.05.2011
comment
@Runner: Оба помогли :) Я прочитал оба, а затем переписал части своего собственного кода, и он заработал. Я, вероятно, взял больше кода из вашей ссылки.   -  person jpfollenius    schedule 31.05.2011


Ответы (2)


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

person Runner    schedule 31.05.2011
comment
Я принимаю это, потому что это помогло мне сделать это правильно. Спасибо @RRUZ за хорошую ссылку. Кстати: вы обрабатываете случай переполнения буфера в своем коде? - person jpfollenius; 31.05.2011

Возможно, вам понадобятся журналы изменений, если вы пытаешься смотреть весь диск.

person Adrian McCarthy    schedule 17.08.2011