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) > 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 <> '' 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 <> 0 then
CloseHandle(FHandleDirectory);
FreeMem(lpBuf,BUF_SIZE);
Application.MainForm.Perform(WM_THREADSTOP,0,0);
end;
Сообщение об ошибке: Процесс не может получить достук файлу, т.к. этот файл занят другим процессом
|