Как сказал @Matt Davis, к сожалению, нет API пользовательского режима, но есть обходной путь, который в зависимости от вашего варианта использования (я написал мой ниже) может делать то, что вы хотите.
В прошлом мне удавалось регистрировать FILE_NOTIFY_CHANGE_LAST_WRITE
вместо FILE_NOTIFY_CHANGE_FILE_NAME
при звонке ReadDirectoryChangesW
:
ZeroMemory(&overlapped, sizeof(OVERLAPPED));
overlapped.hEvent = hChangeEvent;
// ...
ReadDirectoryChangesW(hSpoolPath,
eventBuffer,
EVENT_BUF_LENGTH,
FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE, // <----
NULL,
&overlapped,
NULL);
// ...
HANDLE events[2];
events[0] = hChangeEvent;
events[1] = hCancelEvent;
DWORD wRc = WaitForMultipleObjects(2, events, FALSE, DIRECTORY_WATCH_TIMEOUT);
Время последней записи обновляется, как только процесс-владелец закрывает дескриптор после создания файла и записи в него.
Мой вариант использования был одним процессом, который получал HTTP-запросы через TCP / IP и записывал HTTP-тело в каталог, где другой процесс подхватил его, как только процесс получения завершил запись (и, следовательно, закрыл дескриптор). ) Это. Http-сервер был единственным процессом, который писал в этот каталог, поэтому я мог положиться на шаблон create-write-close.