Win32 C ++ ReadDirectoryChangesW "создание" и "изменение" обнаружения различий в файлах? - PullRequest
3 голосов
/ 21 октября 2010

Вот проблема: я отслеживаю каталог, используя Win32 API ReadDirectoryChangesW . И мне нужно различать вновь созданные файлы и измененные файлы. Но есть проблемы ... как всегда: (

Случаи:

  1. Я отслеживаю каталог для новых / модифицированных (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE). Проблема: После создания файла запускается событие нового файла + событие изменения файла. Но мне нужен только один. Как я могу избежать этого? Когда файл модифицируется, я получаю то, что хочу:).
  2. Я отслеживаю каталог только для нового файла (FILE_NOTIFY_CHANGE_FILE_NAME) - НЕТ ПРОБЛЕМЫ.
  3. Я отслеживаю каталог только для изменения файла (FILE_NOTIFY_CHANGE_SIZE). Проблема: Когда создается новый файл, запускается действие изменения вместе с событием создания файла. Как я могу избежать этого?

Конечно, я реализовал некоторые обходные пути. Но я хочу знать, есть ли какой-нибудь элегантный способ решения проблем, которые я описал.

Заранее спасибо!

1 Ответ

4 голосов
/ 21 октября 2010

Вы должны ловить FILE_NOTIFY_CHANGE_LAST_WRITE, а не FILE_NOTIFY_CHANGE_SIZE, для измененного файла.Файлы могут быть изменены без изменения размера.

Вы также должны сохранять очередь изменений и время, когда они произошли, и обрабатывать очередь только после того, как в течение последних 1-2 секунд не было никаких изменений.Некоторые приложения могут делать очень странные вещи при создании или изменении файлов, и вам, скорее всего, понадобится особый случай для популярных приложений, если вы планируете использовать этот код на свободе.

ReadDirectoryChanges не одиниз самых дружественных функций Winapi.Вы, вероятно, не можете обойтись без получения двух событий при создании файла;Я не совсем уверен, получите ли вы дополнительную модификацию для FILE_NOTIFY_CHANGE_LAST_WRITE при создании, но я думаю, что вы, вероятно, получите.Использование подхода очереди позволит вам легко выбросить дополнительное событие, если оно имеет ту же отметку времени, что и событие создания.

...