Задача: если в папке появляется exe-файл, сразу же удалять его.
Решаю так: пишу сервис под Win2000 и в нем использую ReadDirectoryChangesW:
ol.hEvent = hStopEvent[1];
lstrcpy(szFileName, pszScanDirName);
dwFileNameOffset = lstrlen(pszScanDirName);
lstrcpy(szFileName+dwFileNameOffset++, L"\\");
while( 1 ){
ZeroMemory(pBuffer, dwBufferSize);
ReadDirectoryChangesW(hScanDir, pBuffer, dwBufferSize, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME, &dwRealBufferSize, &ol, NULL);
if( WaitForMultipleObjects(2, hStopEvent, FALSE, INFINITE)==WAIT_OBJECT_0+1 ){
pInfo = (FILE_NOTIFY_INFORMATION*)pBuffer;
while( 1 ){
if( pInfo->Action==FILE_ACTION_ADDED || pInfo->Action==FILE_ACTION_RENAMED_NEW_NAME ){
lstrcpyn(szFileName+dwFileNameOffset, pInfo->FileName, pInfo->FileNameLength+1);
DeleteFile(szFileName);
...
Однако DeleteFile не срабатывает (GetLastError()==ERROR_SHARING_VIOLATION). Я думаю дело в том, что сообщение о том, что в директории появился новый файл, приходит в момент создания этого файла, а не в момент когда он полностью скопировался в эту директорию. Я хотел вместо DeleteFile вызывать CreateFile c параметром FILE_FLAG_DELETE_ON_CLOSE и сразу CloseHandle(hFile) (ну типа когда докопируешься, то сразу же удаляйся). Но CreateFile не проходит, т.к. файл открыт монопольно....
Как решить эту проблему?
В идеале мне нужно что бы ReadDirectoryChangesW сообщала об изменениях в директории в тот момент когда скопированный туда файл уже полностью лежит в этой самой директории. Но как это сделать? Может определить и описать функцию, которая передается последним параметром в ReadDirectoryChangesW (тип LPOVERLAPPED_COMPLETION_ROUTINE) и/или использовать ожидающие функции с окончанием Ex (и параметром bAlertable). Эта область WinApi для меня не знакома. Поэтому буду благодарен не только за подсказки в решении проблемы, но и ссылки на литературу (на русском) по этой теме.