2

Когда я подписываюсь на уведомление FileSystemWatcher, при создании нового файла или изменении существующего файла происходит несколько событий. События происходящие в следующей последовательности:События, возникающие несколько раз в OpenNETCF.IO.FileSystemWatcher

New File

Created

Изменено

Изменено

Изменено

Изменено

Изменен

Изменено

Изменить

Изменено

Удаляется

Измененный

Переименовать

Переименован

Удалить

Удаляется

Rename и Delete работают так, как ожидается. Создано и изменено несколько раз.

Есть ли какое-либо решение/временное решение для получения точного уведомления при добавлении/изменении файлов?

+0

Можете ли вы опубликовать данные о мероприятии? Разве это другое? для событий? –

+0

Похоже, что он имеет аналогичную версию в виде настольной версии: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx. По моему опыту я старался избегать FSW, где это возможно. – PaulG

ответ

3

Если вы посмотрите на исходный код SDF для FSW, вы увидите, что на самом деле это довольно тонкая управляемая прокладка вокруг собственного вызова SHChangeNotifyRegister с установкой dwEventMask, установленной в SHCNE_ALLEVENTS. Обработчик окна передается API, который затем получает обратные вызовы при возникновении изменений, и эти обратные вызовы сортируются по управляемым событиям, которые FSW предоставляет на управляемой стороне.

Теперь, глядя на обратный вызов, это выглядит как есть 9 идентификаторы событий, которые являются ручки, четыре из которых поднимают Changed событие:

  • SHCNE_UPDATEDIR
  • SHCNE_RMDIR
  • SHCNE_UPDATEITEM
  • SHCNE_ATTRIBUTES

Поэтому, когда вы создаете новый файл, SHCNE_CREATE предоставляет вам событие Created, follo wed некоторыми другими обратными вызовами, поднимающими несколько Измененных событий. Все события совпадают с событиями изменений? Если это так, вам нужно будет использовать отладчик для перехода через SDF-код, чтобы увидеть, что именно происходит и для каких реальных обратных вызовов.

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

Обходной путь Я думаю, будет рассмотрено событие args и «group» событий для того же имени файла, которое происходит быстро. Например, если в течение одной секунды вы получаете кучу Измененного и Созданного события для одного и того же имени файла в одной и той же папке, то это хорошая ставка, что это было создание файла.

+0

Ловля событий и определение повторяющихся событий, которые происходят в течение секунды, похоже, являются взломом. Есть ли лучшее решение? –

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