Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
727 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ist tDirectory Threadsicher?

  Alt Heute, 10:22
Hi,

mal eine etwas allgemeinere Frage:

Ist TDirectory.Delete threadsicher? Mal ganz davon abgesehen, wie es grundsätzlich damit aussieht einen Ordner zu löschen und dort nicht sich gegenseitig die Struktur weg zu ziehen, dieses Problems bin ich mir bewusst. Ich versuche das auch zu umgehen, indem ich erst prüfe ob der Ordner vorhanden ist, ihn dann umbenenne und dann erst lösche. Schließt das Risiko nicht zu 100% aus, aber minimiert es für mich auf ein akzeptables Mindestmaß.

Folgende Konstellation die ich nicht wirklich zum laufen bekomme. Mein Projekt wird als ISAPI DLL auf einem IIS laufen. Der erstellt mir für jede Request von einem neuen Benutzer/IP das Webmodule neu. Die DLL schreibt die Zugriffe in Logdateien in separierte Ordner. Ich möchte jetzt beim Erstellen des Webmoduls prüfen, ob ein Ordner mit der Bezeichnung Heutiges Datum minus X Tage existiert und wenn ja, dann möchte ich es löschen. Funktioniert auch Problemlos, solange ich das im Main-Thread laufen lasse. Das Problem das ich aber nun habe ist, dass dann der erste Abruf auf den Endpunkt nach dem Datumswechsel, genau so lange länger braucht wie der Ordner braucht um gelöscht zu werden. Das kann je nach Größe länger dauern. Das wollte ich vermeiden indem ich den Löschprozess in einen Thread werfe. Mit TTask.Run normalerweise keine große Sache, dachte ich. Aber dann funktioniert weder das Umbenenne noch das Löschen. Hab schon gedacht es liegt vielleicht daran, dass das Webmodul wieder freigegeben wird, also hab ich den Task in eine ITask Objekt gepackt und im Destroy des Webmoduls erst noch auf ein WaitAny geprüft. Hat leider auch nicht geholfen.

Habt ihr noch Ideen was es sein könnte?

Ich würde die Aufgabe, alte Logordner abzuräumen nicht der ISAPI DLL überlassen sondern dafür ein eigenes Programm (ohne UI) erstellen, das dann regelmäßig als Hintergrund-Task vom OS ausgeführt wird. Das vermeidet alle Konflikte mit dem Webservice, da der ja auf solch alte Verzeichnisse nicht mehr zugreifen sollte. Für sowas gibt es in Windows den Task Scheduler, andere Betriebssysteme haben sicher 'was äquivalentes.
Peter Below
  Mit Zitat antworten Zitat