Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ThreadProbleme mit DeleteFile (https://www.delphipraxis.net/93314-threadprobleme-mit-deletefile.html)

Fuchtel 4. Jun 2007 10:56


ThreadProbleme mit DeleteFile
 
Hallo,

Ich habe folgendes Problem:

In einer Multithread-Anwendung, die Dateien ließt, verarbeitet und dann löscht, kommt es öfters vor,
daß eigentlich gelöschte Dateien (mit Windows.DeleteFile(sFile) erneut verarbeitet werden.

MSDN schreibt dazu:

Zitat:

The DeleteFile function marks a file for deletion on close. Therefore, the file deletion
does not occur until the last handle to the file is closed. Subsequent calls to CreateFile
Wie kann ich nun feststellen, ob die Datei wirklich schon gelöscht wurde. FileExists(sFile) funzt,
wie oben breschrieben, nicht.

Eventuell kann man das mittels Windoes.GetQueuedCompletionStatus herausbekommen, hat dies schon mal
jemand eingesetzt bzw. einen anderen Vorschlag?

Besten Dank im vorraus.

Fuchtel

SirThornberry 4. Jun 2007 10:59

Re: ThreadProbleme mit DeleteFile
 
liefert dir denn DeleteFile True zurück?

Fuchtel 4. Jun 2007 11:38

Re: ThreadProbleme mit DeleteFile
 
Hallo SirThornberry,

ja, sicherlich aber im Hauptthread, der die anderen anstößt, wird die Datei immer noch gefunden!

Gruß Fuchtel

OregonGhost 4. Jun 2007 11:39

Re: ThreadProbleme mit DeleteFile
 
Bist du denn sicher, dass die Datei auch wirklich überall geschlossen wurde?

Fuchtel 4. Jun 2007 11:42

Re: ThreadProbleme mit DeleteFile
 
Bei mir, das Prog. lauft auf einem Server, ja.

Allerdings werden die Dateien nicht von mir geschrieben. Deshalb brauche ich auch eine verläßliche Abfrage, ob die Datei nun endlich (erfolgreich) gelöscht wurde.

Fuchtel

SirThornberry 4. Jun 2007 14:52

Re: ThreadProbleme mit DeleteFile
 
fileexists versucht die Datei per Auflistung zu finden. Und solange sie per DirectoryListing gefunden wird ist sie nunmal noch nicht gelöscht.

Fuchtel 5. Jun 2007 13:09

Re: ThreadProbleme mit DeleteFile
 
Ich habe jetzt doch eine hinreichend funktionierende Lösung gefunden:


Delphi-Quellcode:
function TestFileToUse(const sFile : string ) : boolean;
var
   hFile     : THandle;
   lpFileInfo : TByHandleFileInformation;
begin
   Result := false;
   if not FileExists(sFile) then exit;                                // File existiert nicht
   hFile := CreateFile(pchar(sFile),
                       GENERIC_READ or GENERIC_WRITE,
                       0,
                       nil,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH,
                       0);
  If (hFile = INVALID_HANDLE_VALUE) then Exit;                        // File in Bearbeitung
  GetFileInformationByHandle(hFile, lpFileInfo);
  CloseHandle(hFile);
  If lpFileInfo.dwFileAttributes and sysutils.faArchive = 0 then Exit; // Kein A-Flag
  Result := true;
end;
Gleichzeitig wird beim Begin der Verarbeitung der Dateien das A-Flag zurückgesetzt.

Gruß Fuchtel

Flax 5. Jun 2007 13:44

Re: ThreadProbleme mit DeleteFile
 
Synchronisiert du den Löschvorgang überhaupt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz