как только в папке появляется файл, его нужно тут же удалить
От: sandrey_  
Дата: 25.02.04 11:30
Оценка:
Задача: если в папке появляется 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 для меня не знакома. Поэтому буду благодарен не только за подсказки в решении проблемы, но и ссылки на литературу (на русском) по этой теме.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.