Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie gehe ich mit meinen temporären Daten um? (https://www.delphipraxis.net/186454-wie-gehe-ich-mit-meinen-temporaeren-daten-um.html)

Der schöne Günther 3. Sep 2015 18:11

Wie gehe ich mit meinen temporären Daten um?
 
Eine Anwendung erstellt munter Dateien in
Delphi-Quellcode:
TPath.GetTempPath()
(%userprofile%\AppData\Local\Temp). Bislang ist anscheinend jeder davon ausgegangen dass Windows diese Dateien irgendwann wohl von alleine löschen wird.

Ich stelle gerade etwas schockiert fest, dass dem wohl nicht so ist. Wie kommen wir aus dieser Nummer wieder heraus? Die temporären Dateien werden teilweise mit externen Programmen wie bspw. einem PDF-Betrachter geöffnet. Ich weiß also nicht wann sie nicht mehr in Gebrauch sind.

Meine Idee wäre nun folgende:
  • Die Daten gehen ab sofort in ein Unterverzeichnis des Temp-Ordners
  • Immer wenn man eine Datei in den Temp-Ordner werfen will wird vorher geprüft ob sich Dateien darin befinden die gelöscht werden dürfen (bspw. älter als 5 Tage)
  • Diese werden entfernt, erst dann geht es weiter

Das sollte relativ sicher sein, oder? Ich will nicht die ganze Zeit erstelle Dateien im Hintergrund tracken. Es kann auch sein dass die Anwendung wochen- und monatelang am Stück durchläuft, die Systeme haben auch nur eine relativ kleine SSD: Prüfen bei Anwendungsstart und -Ende reicht nicht.

Hat noch jemand eine bessere Idee? Ich weiß noch dass man in der Registry eine Liste von Dateien anlegen kann die beim nächsten Reboot gelöscht werden sollen, aber das ist uU zu spät und man braucht dafür Admin-Rechte.

Zacherl 3. Sep 2015 19:01

AW: Wie gehe ich mit meinen temporären Daten um?
 
Vielleicht zu umständlich, aber mit MSDN-Library durchsuchenNtQuerySystemInformation kannst du alle offenen Handles enumerieren. Die kannst du dann mit deinen temporären Dateien abgleichen und wüsstest so zumindest schonmal, welche Datei noch irgendwo geöffnet ist.

Anderer Ansatz wäre das Starten der externen Programme in einem extra Thread, den du mit MSDN-Library durchsuchenWaitForSingleObject auf Beendigung des Prozesses warten lässt.

nahpets 3. Sep 2015 19:17

AW: Wie gehe ich mit meinen temporären Daten um?
 
Hallo,

habe mir mal vor längerer Zeit ein Progrämmelke dafür geschrieben, dass auf den Servern alte Log-Dateien wegwerfen sollte.

Man kann die Verzeichnisse per Dialog auswählen, und angeben, wie alt (oder älter) Dateien sein müssen, die gelöscht werden sollen.

Per Button wird das dann gemacht.

Da das für den Serverbetrieb nicht sehr clever ist, kann man das Programm auch mit einem beliebigen Parameter aufrufen.
Dann räumt es auf und beendet sich wieder.

Das dann in den Taskplaner gepackt und schon muss man sich nicht mehr kümmern.

Schau mal, vielleicht kannste damit ja was anfangen.

(Nutzt 'nen Dialog aus der JVCL.)

Luckie 3. Sep 2015 19:46

AW: Wie gehe ich mit meinen temporären Daten um?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1314602)
Eine Anwendung erstellt munter Dateien in
Delphi-Quellcode:
TPath.GetTempPath()
(%userprofile%\AppData\Local\Temp). Bislang ist anscheinend jeder davon ausgegangen dass Windows diese Dateien irgendwann wohl von alleine löschen wird.

Woher soll Windows wissen, ob die Dateien noch gebraucht werden?

Du weißt doch welche Dateien du erstellt hast. Lösche sie beim Beenden deines Programms. Fertig. Nix mit offenen Handles suchen oder so.

Daniel 3. Sep 2015 19:55

AW: Wie gehe ich mit meinen temporären Daten um?
 
Er schreibt, dass die Anwendung ggf. zu lang läuft, so dass zwischen Programmstart und -Ende zusätzlich geprüft und bei Bedarf gehandelt werden muss.

jfheins 3. Sep 2015 20:49

AW: Wie gehe ich mit meinen temporären Daten um?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1314602)
Hat noch jemand eine bessere Idee? Ich weiß noch dass man in der Registry eine Liste von Dateien anlegen kann die beim nächsten Reboot gelöscht werden sollen, aber das ist uU zu spät und man braucht dafür Admin-Rechte.

Das sollte auch ohne Adminrechte gehen. Die Doku zu MoveFileEx sagt:
Zitat:

If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts.
Ansonsten(die Sache mit dem externen PDF-Viewer) würde ich sagen: Merke dir alle temporären Dateien in ner Liste und versuche einmal am Tag jede Datei zu löschen. Was nicht klappt, wird wohl noch verwendet.

Luckie 3. Sep 2015 20:50

AW: Wie gehe ich mit meinen temporären Daten um?
 
Zitat:

Zitat von Daniel (Beitrag 1314613)
Er schreibt, dass die Anwendung ggf. zu lang läuft, so dass zwischen Programmstart und -Ende zusätzlich geprüft und bei Bedarf gehandelt werden muss.

Aber den Bedarf kennt nur er. Windows ist nicht hellsichtig.

Headbucket 4. Sep 2015 06:32

AW: Wie gehe ich mit meinen temporären Daten um?
 
Wenn ich dich richtig verstanden habe, dann kopierst du Dateien in den Temp-Ordner um sie dann zu öffnen. Danach können sie wieder gelöscht werden, richtig?

Was spricht dann dagegen, per StartAndWait darauf zu warten? Oder wie hier bereits geschrieben in einen extra Thread auslagern. Die ganze Geschichte mit den 5 Tagen usw. finde ich fast etwas umständlich. Außer du startest die Datei mehrmals hintereinander und willst sie nicht jedes mal wieder in den Temp-Ordner kopieren.

Ich hatte schonmal den Fall, dass ich eine Datei aus der Datenbank öffnen wollte. Hier habe ich einfach folgende Funktion benutzt, die den Exitcode auswertet:
Delphi-Quellcode:
function StartAndWait(const ExecuteFile: string; ParamString: string = ''): boolean;
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  Result := False;
  if not FileExists(ExecuteFile) then Exit;
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
    begin
      fMask := SEE_MASK_NOCLOSEPROCESS;
      Wnd := Application.Handle;
      lpFile := PChar(ExecuteFile);
      lpParameters := PChar(ParamString);
      nShow := SW_SHOWNORMAL;
    end;
  if ShellExecuteEx(@SEInfo) then
    begin
      repeat
        Application.ProcessMessages;
        Sleep(100);
        GetExitCodeProcess(SEInfo.hProcess, ExitCode);
      until (ExitCode <> STILL_ACTIVE) OR Application.Terminated;
      Result := True;
    end;
end;

begin
  [...]                    //Aus Datenbank in Temp-Order kopieren
  StartAndWait(ExecuteFile);//Starten und auf Beenden warten
  DeleteFile(ExecuteFile); //Löschen
end;
Aber ich denke ja mal fast, dass du diese Methode schon ausgeschlossen hast. Wieso?

Grüße

Daniel 4. Sep 2015 06:44

AW: Wie gehe ich mit meinen temporären Daten um?
 
Wie viel kannst Du Deinen Anwendern zutrauen?
Ich hatte hier mal mit Office-Dokumenten zutun, die in einer Datenbank gespeichert wurden. Via Doppelklick hatte ich sie auch in den Temp-Ordner gelegt und dann per ShellExecute geöffnet. Zuerst war der Anwender glücklich, denn er sah das Dokument. Dann fing er ungnädigerweise an, das Dokument zu bearbeiten und auch zu speichern - auch das ging. Und über die Liste der letzten Dokumente hat er es jenseits unserer Anwendung in Excel wieder aufgerufen und weiter bearbeitet - unwissentlich, dass die Datei im Temp-Ordner nur "bedingt gut" aufgehoben war.
Bis dann irgendeine System-Reinigung zuschlug und die Datei ins Aus beförderte.

Dejan Vu 4. Sep 2015 06:55

AW: Wie gehe ich mit meinen temporären Daten um?
 
Soweit ich mich erinnere, kann man auch die Namen der Temp-Dateien vorgeben, zumindest den Präfix.
Wenn das noch stimmt, lösche beim Programmstart einfach alle 'Deine' (alten) Tempdateien. Die, die gesperrt sind, sind offenbar noch in Verwendung.

Oder ist das ein Service? Na dann, einfach regelmäßig (dann kannst Du dir die auch merken).


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr.
Seite 1 von 4  1 23     Letzte » 

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