Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Мониторинг каталога WinAPI Delphi

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Мониторинг каталога WinAPI Delphi
Имя
Сообщение << Старые топики   Новые топики >>
Мониторинг каталога WinAPI Delphi - 2008-12-16 17:32:41.093333   
1ohnmak

Сообщений: 1
Оценки: 0
Присоединился: 2008-12-16 17:03:09.906666

Подскажите как определить когда отслеженный файл освобождается процессом, который вставил этот файл в каталог и с файлом можно производить операции MoveFile, DeleteFile и т.д.

FHandleDirectory := CreateFile (FDirPath,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0); if FHandleDirectory = INVALID_HANDLE_VALUE then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end; GetMem(lpBuf,BUF_SIZE); try repeat ZeroMemory(lpBuf,BUF_SIZE); cbReturn := cardinal(@FileIOCompletionRoutine); FILE_NOTIFY_CHANGE := FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE; if not ReadDirectoryChangesW(FHandleDirectory,lpBuf,BUF_SIZE, false, FILE_NOTIFY_CHANGE,@cbReturn,nil,nil) then begin SysErrorMessage(GetLastError); Break; end ; Ptr:=lpBuf; repeat case PFileNotifyInformation(Ptr).Action of FILE_ACTION_ADDED : begin // 0x00000001 sFileName := WideCharLenToString(PFileNotifyInformation(Ptr).FileName,PFileNotifyInformation(Ptr).FileNameLength); if AnsiPos(cFileNameForBreak,sFileName) &gt; 0 then Exit; end; FILE_ACTION_REMOVED : begin // 0x00000002 end; { FILE_ACTION_MODIFIED : begin // 0x00000003 end; FILE_ACTION_RENAMED_OLD_NAME : begin // 0x00000004 end; FILE_ACTION_RENAMED_NEW_NAME : begin // 0x00000005 end; FILE_NOTIFY_CHANGE_LAST_WRITE : begin // 0x00000010 end; FILE_NOTIFY_CHANGE_LAST_ACCESS : begin // 0x00000020 end;} else begin end; end; if PFileNotifyInformation(Ptr).NextEntryOffset=0 then begin if sFileName &lt;&gt; '' then begin Application.ProcessMessages; // WaitForSingleObject(msgEndOperation,5000); if not MoveFileEx(PAnsiChar(FDirPath+sFileName),PAnsiChar(FDirStore+sFileName), MOVEFILE_REPLACE_EXISTING+MOVEFILE_WRITE_THROUGH) then Application.MessageBox(PChar(SysErrorMessage(GetLastError)),'Error',MB_OK+MB_ICONERROR); Application.ProcessMessages; sFileName := ''; end ; Break end else begin Inc(Cardinal(Ptr),PFileNotifyInformation(Ptr).NextEntryOffset); end; until false; until false or Terminated; finally if FHandleDirectory &lt;&gt; 0 then CloseHandle(FHandleDirectory); FreeMem(lpBuf,BUF_SIZE); Application.MainForm.Perform(WM_THREADSTOP,0,0); end;

Сообщение об ошибке:
Процесс не может получить достук файлу, т.к. этот файл занят другим процессом
Post #: 1
RE: Мониторинг каталога WinAPI Delphi - 2008-12-16 17:44:57.236666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
FILE_NOTIFY_CHANGE_FILE_NAME приходит когда процесс начинает менять файл. Если не ошибаюсь, то отловить конец изменения из user-mode никак не получится.
Post #: 2
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Мониторинг каталога WinAPI Delphi







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.