AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie gehe ich mit meinen temporären Daten um?

Wie gehe ich mit meinen temporären Daten um?

Offene Frage von "jobo"
Ein Thema von Der schöne Günther · begonnen am 3. Sep 2015 · letzter Beitrag vom 6. Sep 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Der schöne Günther

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wie gehe ich mit meinen temporären Daten um?

  Alt 3. Sep 2015, 19:11
Eine Anwendung erstellt munter Dateien in 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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

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

  Alt 3. Sep 2015, 20:01
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

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

  Alt 3. Sep 2015, 20:17
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.)

Geändert von nahpets (21. Nov 2017 um 17:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 3. Sep 2015, 20:46
Eine Anwendung erstellt munter Dateien in 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel
(Administrator)

Registriert seit: 30. Mai 2002
Ort: Hamburg
15.534 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 3. Sep 2015, 20:55
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.
Daniel R. Wolf
Admin Delphi-PRAXiS
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

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

  Alt 3. Sep 2015, 21:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 3. Sep 2015, 21:50
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

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

  Alt 4. Sep 2015, 07:32
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
  Mit Zitat antworten Zitat
Daniel
(Administrator)

Registriert seit: 30. Mai 2002
Ort: Hamburg
15.534 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 4. Sep 2015, 07:44
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.
Daniel R. Wolf
Admin Delphi-PRAXiS
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

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

  Alt 4. Sep 2015, 07:55
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).
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf