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?
Thema durchsuchen
Ansicht
Themen-Optionen

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 2 von 4     12 34      
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#11

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

  Alt 4. Sep 2015, 08:03
1/2 OT: Sehr löbliches Vorhaben, daß viel zu wenig Nachahmer findet. Ich hatte neulich 4GB an temporären Dateien und Ordnern aus meinem ein Jahr altem System gelöscht, da meine Programme sowas nicht verwenden, weiss ich daß das Müll von den paar anderen Programmen sein muss, die sonst noch auf meinem Rechner werkeln.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.081 Beiträge
 
Delphi 12 Athens
 
#12

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

  Alt 4. Sep 2015, 08:54
Löblich finde ich das auch, aber ...

War das nicht genau der Sinn des Temp-Ordners, das er von Zeit zu Zeit mal gelöscht werden soll ?
Ich denke nicht das MS hier unbedingt gelöscht haben möchte, zumindest macht das aus meiner Erfahrung kaum ein Programm.

Ich bin immer ganz froh wenn die Platte mal wieder eng wird das ich da noch ein paar GB wieder freischaufeln kann.

Edit:
Wenn ich Temp Daten verwende, dann in eigenen Unterverzeichnissen, da habe ich dann die volle Kontrolle drüber.

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#13

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

  Alt 4. Sep 2015, 08:59
Solche Dateien bräuchten ein Selbstzerstörungsflag, so Mission-impossible-mäßig, die Datei zerstört sich in 3 Stunden selbst.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#14

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

  Alt 4. Sep 2015, 09:12
1/2 OT: Sehr löbliches Vorhaben, daß viel zu wenig Nachahmer findet.
Dem genau ist leider so. Eigene Dateien kann man (mit etwas Disziplin) verwalten und dort für Ordnung sorgen (z. B. eigenes Verzeichnis unterhalb von Temp und beim Programmende alles wegwerfen, was da noch übrig ist). Soll der Anwender da nicht ausversehen (wie Daniel beschrieb) mit den Dateien arbeiten, dann kommt auf die Dateien das Schreibschutzattribut drauf, damit können Excel und Co. da nicht mehr Schreiben und der Anwender wird drauf hingewiesen. Er kann ja dann "speichern unter"-wählen und hat ab da die Verantwortung für die veränderte Datei.
Ich hatte neulich 4GB an temporären Dateien und Ordnern aus meinem ein Jahr altem System gelöscht, da meine Programme sowas nicht verwenden, weiss ich daß das Müll von den paar anderen Programmen sein muss, die sonst noch auf meinem Rechner werkeln.

Sherlock
Darin siehe ich das Hauptptoblem. Um dem abzuhelfen, gibt es bei mir im Autostart eine Batchdatei mit dem schönen Namen DelTemp.bat und so sieht sie aus:
Delphi-Quellcode:
@echo temporaere Dateien loeschen
if exist o:\~$PVRTmp0$\*.* rd /s /q o:\~$PVRTmp0$
if exist e:\~$PVRTmp0$\*.* rd /s /q e:\~$PVRTmp0$
if exist c:\temp\acrord32_sbx\*.* rd /s /q c:\temp\acrord32_sbx
if exist "c:\Dokumente und Einstellungen\stephan\Lokale Einstellungen\Temporary Internet Files\Content.IE5\*.*" rd /s /q "c:\Dokumente und Einstellungen\stephan\Lokale Einstellungen\Temporary Internet Files\Content.IE5"
if exist "c:\Dokumente und Einstellungen\stephan\Cookies\*.*" rd /s /q "c:\Dokumente und Einstellungen\stephan\Cookies"
if exist "c:\wincmd5\$wc\*.*" del /q c:\wincmd5\$wc\*.*"
if exist "c:\temp\*.*" del /q c:\temp\*.*"
if exist "c:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Avira\AntiVirus\LogFiles\*.*" rd /s /q "c:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Avira\AntiVirus\LogFiles"
if exist "c:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Avira\AntiVirus\Reports\*.*" rd /s /q "c:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Avira\AntiVirus\Reports"
Das sind die mit bekannten Stellen, an denen diverse andere ihren Müll hinterlassen und dort wird dann beim Rechnerstart aufgeräumt. Was noch in Benutzung ist, kann von der Batchdatei nicht gelöscht werden und ist dann ggfls. beim nächsten Mal dran.

Seit dem wird die Festplatte nicht mehr so schnell voll.
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 4. Sep 2015, 10:38
Danke für die vielen Antworten bisher!

Ich will es an dieser einen Anwendung gar nicht zu sehr festmachen. Dem Anwender kann ich (im negativen Sinne) alles zutrauen. Auch dass er 500 mal den PDF-Betrachter offen lässt und wieder ins Hauptprogramm wechselt.

Ich hätte gedacht dass Windows mit der Zeit automatisch das macht, wenn ich im Explorer auf Bereinigen gehe. Da es da wohl nichts gibt muss man periodisch wohl alles rauswerfen. Ich dachte dann an so etwas in der Art. Würdet ihr das so absegnen oder übersehen ich noch etwas?

Delphi-Quellcode:
unit App.TempFileManager;

interface uses System.TimeSpan, System.Classes, System.Types;

type
   TTempFileManager = class(TObject)
      protected const
         guid = '{255AC97A-A42E-44F3-86E1-DF00B7C67FD5}';
      protected var
         maxFileAge: TTimeSpan;
      protected
         function getPath(): String;
         function findFiles(const olderThan: TDateTime): TStringDynArray;
      public var
         cleanupOnEveryRequest: Boolean;
      public
         constructor Create(const maxFileAge: TTimeSpan); overload;
         constructor Create(const maxFileAgeHours: Integer); overload;

         procedure doCleanup(const recursive: Boolean = False);
         /// <summary>
         /// Liefert einen neuen Dateinamen im <see cref="Path" />-Verzeichnis
         /// </summary>
         /// <param name="extension">
         ///      Optionale Dateinamenerweiterung. Beispiel: <c>.pdf</c> oder
         /// <c>txt</c>. Das Trennzeichen-Prefix ist optional
         /// </param>
         function getTempFileName(const extension: String = ''): String;
         /// <summary>
         /// Liefert einen <c>TFileStream</c> auf eine neue, im
         /// <see cref="Path"/>-Verzeichnis erstellte Datei
         /// </summary>
         /// <param name="extension">
         ///      Optionale Dateinamenerweiterung. Beispiel: <c>.pdf</c> oder
         /// <c>txt</c>. Das Trennzeichen-Prefix ist optional
         /// </param>
         function getTempFile(const extension: String = ''): TFileStream;
      public //properties
         property Path: String read getPath;
   end;

implementation uses System.IoUtils, System.SysUtils, System.DateUtils;

type
   TDateTimeHelper = record helper for TDateTime
      function IncSpan(const timeSpan: TTimeSpan): TDateTime;
      function DecSpan(const timeSpan: TTimeSpan): TDateTime;
   end;

   TFileHelper = record helper for TFile
      class procedure TryDelete(const Path: String); static;
   end;

{ TTempFileManager }

constructor TTempFileManager.Create(const maxFileAgeHours: Integer);
var
   asTimeSpan: TTimeSpan;
begin
   asTimeSpan := TTimeSpan.FromHours(maxFileAgeHours);
   self.Create(asTimeSpan);
end;

constructor TTempFileManager.Create(const maxFileAge: TTimeSpan);
begin
   inherited Create();
   self.maxFileAge := maxFileAge;
end;

procedure TTempFileManager.doCleanup(const recursive: Boolean = False);
var
   mustBeOlderThan:   TDateTime;
   foundFiles:         TStringDynArray;
   filePath:         String;
begin
   mustBeOlderThan := Now().DecSpan(maxFileAge);
   foundFiles := findFiles(mustBeOlderThan);

   for filePath in foundFiles do TFile.TryDelete(filePath);
end;

function TTempFileManager.findFiles(const olderThan: TDatetime): TStringDynArray;
var
   predicate: TDirectory.TFilterPredicate;
begin
   if not TDirectory.Exists(Path) then Exit(nil);

   predicate :=
      function(const Path: string; const SearchRec: TSearchRec): Boolean
      begin
         // SearchRec.TimeStamp bezeichnet das "Geändert am"
         Result := CompareDateTime(SearchRec.TimeStamp, olderThan) = LessThanValue;
      end;

   Result := TDirectory.GetFiles(Path, TSearchOption.soTopDirectoryOnly, predicate);
end;

function TTempFileManager.getTempFileName(const extension: String): String;
var
   filename: TFileName;
begin
   if cleanupOnEveryRequest then doCleanup();

   filename := TPath.GetGUIDFileName();
   if not extension.IsEmpty() then begin
      if not extension.StartsWith(TPath.ExtensionSeparatorChar) then
         filename := filename + TPath.ExtensionSeparatorChar;
      filename := filename + extension;
   end;

   Result := TPath.Combine(Path, filename)
end;

function TTempFileManager.getPath(): String;
begin
   Result := TPath.GetTempPath();
   Result := TPath.Combine(Result, guid);
end;

function TTempFileManager.getTempFile(const extension: String): TFileStream;
var
   path: String;
begin
   path := getTempFileName(extension);
   if TFile.Exists(path) then TFile.Delete(path);
   Result := TFile.Create(path);
end;

{ TDateTimeHelper }

function TDateTimeHelper.IncSpan(const timeSpan: TTimeSpan): TDateTime;
begin
   Result := System.DateUtils.IncMilliSecond(self, Round(timeSpan.TotalMilliseconds));
end;

function TDateTimeHelper.DecSpan(const timeSpan: TTimeSpan): TDateTime;
begin
   Result := System.DateUtils.IncMilliSecond(self, Round(-timeSpan.TotalMilliseconds));
end;

{ TFileHelper }

class procedure TFileHelper.TryDelete(const Path: String);
begin
   try
      Delete(Path);
   except
      on EDirectoryNotFoundException do;
      on EFileNotFoundException do;
      on EInOutError do;
   end;
end;

end.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#16

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

  Alt 4. Sep 2015, 11:15
Wenn man möchte kann man die o.g. Batchdatei dann noch mit "delage32.exe" (Download unter: Horst Schaeffer's Software Pages) anreichern.

Geändert von samso ( 4. Sep 2015 um 11:35 Uhr) Grund: Link hinzugefügt
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#17

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

  Alt 4. Sep 2015, 12:54
Bislang ist anscheinend jeder davon ausgegangen dass Windows diese Dateien irgendwann wohl von alleine löschen wird.
Nö, das ist mir schon länger bekannt. Dafür gibt es in Windows die "Datenträgerbereinigung" (cleanmgr.exe). Oder eben von Zeit zu Zeit %tmp% in die Adressleiste des Windows-Explorers eingeben und dann manuell löschen.

Solche Dateien bräuchten ein Selbstzerstörungsflag, so Mission-impossible-mäßig, die Datei zerstört sich in 3 Stunden selbst.
So etwas ähnliches gibt es. Nennt sich FILE_FLAG_DELETE_ON_CLOSE. Habe ich schon erfolgreich für temporäre Dateien benutzt. Erklärung siehe MSDN CreateFile. Man beachte auch FILE_ATTRIBUTE_TEMPORARY, damit wird eine Datei so lange wie möglich im Arbeitsspeicher gehalten, bevor sie auf Platte geschrieben wird.
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 4. Sep 2015, 13:05
Ja, das Flag benutzt wahrscheinlich 7-Zip, weshalb man fast keine einzige Datei in Archiven mit einem Doppelklick öffnen kann da er immer die temporären Dateien schon löscht bevor das Anzeige-Programm überhaupt die Chance hatte es zu öffnen.
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#19

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

  Alt 4. Sep 2015, 13:11
Das wäre dann ein Bug von 7-Zip. Wenn man das Flag korrekt benutzt, kann es sehr hilfreich sein.

Ich habe auch gerade mal nachgeschaut: Windows führt die Datenträgerbereinigung automatisch aus, aber wohl erst wenn der Speicherplatz knapp wird. Ein entsprechender Task ist in der "Aufgabenplanung" definiert. Man könnte sich leicht einen eigenen anlegen, der die Datenträgerbereinigung öfter ausführt, z.B. einmal wöchentlich.
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 4. Sep 2015, 13:31
Tatsächlich. "Aufgaben planen" -> [...] -> Vom System verwendete Wartungsaufgabe zum Starten einer unbeaufsichtigten automatischen Datenträgerbereinigung, sobald der freie Speicherplatz zur Neige geht.

Das schaue ich mir mal näher an...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 12:24 Uhr.
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