Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Re: Festplattenzugriffe
14. Mär 2006, 13:16
Das zweite Problem mit dem Löschen besteht immer noch und ich bräuchte dafür eine Lösung. Bisher sieht es so aus:
Delphi-Quellcode:
procedure TcsDirThread.Execute;
const
WC_NO_BEST_FIT_CHARS = $00000400;
var
pBuf : Pointer;
pWork : Pointer;
dwBufLen : DWORD;
dwDummy : DWORD;
FNI : FILE_NOTIFY_INFORMATION;
dwRead : DWORD;
dwKey : DWORD;
pOVL : POVERLAPPED;
iCopyLen : integer; // Prevent Buffer Overflow
begin
pOVL := @Fovl;
dwBufLen := 65536;
GetMem(pBuf, dwBufLen);
try
while not Terminated do
begin
ZeroMemory(pBuf, dwBufLen);
if ReadDirectoryChangesW(FhFile, pBuf, dwBufLen, true,
//FILE_NOTIFY_CHANGE_FILE_NAME or
//FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_ATTRIBUTES or
FILE_NOTIFY_CHANGE_SIZE or
FILE_NOTIFY_CHANGE_LAST_WRITE or
FILE_NOTIFY_CHANGE_LAST_ACCESS or
FILE_NOTIFY_CHANGE_CREATION {or
FILE_NOTIFY_CHANGE_SECURITY},
@dwDummy, @Fovl, nil) then
begin
if Terminated then
break;
if not GetQueuedCompletionStatus(FhComPort, dwRead, dwKey, pOVL, INFINITE) then
begin
Terminate;
end
else
begin
if Terminated then
break;
pWork := pBuf;
repeat
CopyMemory(@FNI, pWork, 12);
iCopyLen := FNI.dwFileNameLength;
if iCopyLen > _iFilenameLength then
iCopyLen := _iFilenameLength;
CopyMemory(@FNI.wFilename[1], PChar(pWork) + 12, iCopyLen);
PChar(pWork) := PChar(pWork) + FNI.dwNextEntryOffset;
FsReason := GetReason(FNI.dwAction);
FsFileName := TrimString(FNI.wFilename);
// raise event
if Assigned(OnDirectoryChanges) then
FOnDirectoryChanges(self, FsFileName, FsReason);
until FNI.dwNextEntryOffset = 0;
end;
end
else
begin
if Assigned(OnDirectoryChangesError) then
FOnDirectoryChangesError(self, GetLastError, SysErrorMessage(GetLastError));
Terminate;
end;
end;
finally
FreeMem(pBuf, dwBufLen);
end;
end;
Ändert sich etwas, wird also ein Event ausgelöst in dem ich auf die Änderung reagiere:
Delphi-Quellcode:
{*
* Procedure: TForm1.MyOnDirectoryChanges
* Change occured
* Author : michael.puff
* Date : 2006-03-10
*}
procedure TForm1.MyOnDirectoryChanges(Sender: TObject; const Filename,
Reason: string);
function GetProjectPath: String;
begin
result := copy(ExtractFilepath(ParamStr(0)), 1, length(ExtractFilepath(ParamStr(0))) - 4);
//ShowMessage(result);
end;
begin
Memo1.Lines.Add(Format('neue / geänderte Datei %s [%s]', [Trim(Filename), Reason]));
if CopyFile(PChar(DIRPATH + '\' + Filename), PChar(GetProjectPath + '\' + Filename), False) then
begin
Memo1.Lines.Add(Format('Datei %s kopiert', [Filename]));
Memo1.Refresh;
Sleep(2000);
Application.ProcessMessages;
if DeleteFile(DIRPATH + '\' + Filename) then
Memo1.Lines.Add(Format('Datei %s gelöscht', [Filename]))
else
Memo1.Lines.Add(Format('Fehler beim Löschen von Datei %s [%s]', [Filename, SysErrorMessage(GetLastError)]));
end
else
Memo1.Lines.Add(Format('%s [%s]', [Filename, SysErrorMessage(GetLastError)]));
end;
Aber leider bekomme ich beim Löschen immer ein "Zugriff verweigert". Die Überwachung erst zu unterbrechen, die Dateien zu löschen und dann die Überwachung wieder zu starten, ist leider nicht so schön, da während der Unterbrechung neue dateien hinzugekommen sein könnten. Dies müsste ich dann auch behandlen und würde einen zusätzlichen Verwaltungsaufwand bedeuten. Was sehr unschön wäre.
Michael Ein Teil meines Codes würde euch verunsichern.
|