2010-10-20 2 views
3

В этом заключается проблема: я отслеживаю каталог с помощью функции Win32 API ReadDirectoryChangesW. И мне нужно различать только что созданные файлы и измененные файлы. Но есть проблемы ... как всегда :(Win32 C++ ReadDirectoryChangesW «создание» и «изменение» обнаружения разности файлов?

Случаи:

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

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

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

+0

Может ли он игнорировать изменения размеров при размере от 0 до ненулевого? –

+0

В момент времени я не знаю размер файла, я знаю только, что файл изменен. – dmitril

+0

Единственное, что помогает на данный момент, - это пропустить следующее событие, поставив таймер на 1 секунду и пропустить его. Но это работа, а не решение :) – dmitril

ответ

4

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

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

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

+0

На FILE_NOTIFY_CHANGE_LAST_WRITE вы получите 3 уведомления :) – dmitril