Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi problem beim Dateien löschen (https://www.delphipraxis.net/117094-problem-beim-dateien-loeschen.html)

SaFu 11. Jul 2008 12:39


problem beim Dateien löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tach Delphifreunde

Nach längerer Zeit habe ich mal wieder ne Frage, weil ich absolut ratlos bin und keinen Ansatz finde.

Ich habe in meheren Ordner eine Dateien Strucktur wie im Bild (siehe Anhang).
Die Ordner in den ich diese Strucktur habe lasse ich über eine ShellTreeView anzeigen.

Jetzt will ich alle Dateien löschen die älter sind als "Eingestellte" Tage. Das habe ich auch schon geschaft aber mit einer Lösung die nicht Optimal ist (aus einem anderen Post und angepasst).

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
Var  SearchRec :TSearchRec;
begin if FindFirst(ShellTreeView2.Path + '\Stats\Saga\*.*', faAnyFile, SearchRec) = 0 then
  begin
    repeat
     if ((SearchRec.Attr and faDirectory) <> FaDirectory) and (SearchRec.Name <>'.') and (SearchRec.Name <>'..') then
       begin
         if FileDateToDateTime(FileAge(ShellTreeView2.Path + '\Stats\Saga\' + SearchRec.Name)) < (Date - iTagevar) then
        begin
          DeleteFile(ShellTreeView2.Path + '\Stats\Saga\' + SearchRec.Name); // Delete File
        end;
       end;
    until FindNext(SearchRec) <> 0;
  end;
  FindClose(SearchRec);
 Timer1.Enabled:= False;
end;
Und hier meine schwirigkeiten

1. Es wird Immer nur im Ordner gelöscht den ich über die ShellTreeview ausgewählt habe.
2. Es werden auch Dateien nach der einegstellten Zeit gelöscht, die nicht gelöscht werden sollen. (z.b eine Notiz)
3. Es sollen nur Dateien gelöscht werden die nur das Datum + Dateiname haben
4. Ich möchte anhand des Datums aus dem Dateinamen diese Prüfung auf Alter der Datei vornehmen.

Hoffe es kann mir jemand helfen

Gruss Sascha

gmc616 11. Jul 2008 13:03

Re: problem beim Dateien löschen
 
Zitat:

Zitat von fuknersascha
Tach Delphifreunde

Tach Delphifreund. :-D

Zitat:

Zitat von fuknersascha
1. Es wird Immer nur im Ordner gelöscht den ich über die ShellTreeview ausgewählt habe.

Das ist doch gut so. Oder will du auch Unterordner leer räumen?
Dann solltest die du die Timer1Timer-Procedure erst ma in eine eigene Procedure packen, mit dem "Startordner" als Parameter (in deinem Fall "ShellTreeView2.Path + '\Stats\Saga\").

Mit (SearchRec.Attr and faDirectory) kriegst du ja raus, ob es sich um einen Unterordner handelt.
Ist dies der Fall, rufst du die gleiche Produrce rekusiv noch einmal auf, mit dem Unterorder als neuen Startordner-Parameter.

Zitat:

Zitat von fuknersascha
2. Es werden auch Dateien nach der einegstellten Zeit gelöscht, die nicht gelöscht werden sollen. (z.b eine Notiz)

Könnte es sein, das du ein Winter-Sommerzeit-Problem hast. Ich glaube FileDateToDateTime gibt dir nur die CET-Zeit zurück, ohne Winter-Somerzeit zu berücksichtigen. Welche Dateien werden typischer Weise gelöscht, die nicht hätten gelöscht werden dürfen? Notizen kann ich aus deinem Screenshot nicht erkennen.

Zitat:

Zitat von fuknersascha
3. Es sollen nur Dateien gelöscht werden die nur das Datum + Dateiname haben

Dann solltest du auch auf den Dateinamen prüfen.

Zitat:

Zitat von fuknersascha
4. Ich möchte anhand des Datums aus dem Dateinamen diese Prüfung auf Alter der Datei vornehmen.

Dann wandle die ersten 10 Zeiten des Dateinames in eine Datum und verleiche das.

SaFu 11. Jul 2008 13:13

Re: problem beim Dateien löschen
 
Danke für die Antworten

zu1. Naja habe ich so halbwegs verstanden werde ich mal versuchen

zu2. Das mit der Zeit habe ich blöd ausgedrückt. Die Winterzeit und so weiter ist egal. Es wird einfach z.B 13:00 uhr eingestellt und dann wird der Timer1 um 13:00 ausgelöst.
Bis jetzt keine Notizen drin und auch andere Dateien will nur vorsorgen falls mal einer was wichtiges in diesem Ordner ablegt und dann wäre es Blöd wenn dieses dann irgendwann aufeinmal weg wäre.

zu3+4. Da habe ich ja die schwirigkeiten da finde ich irgenwie keinen Ansatz

DeddyH 11. Jul 2008 13:19

Re: problem beim Dateien löschen
 
Schau Dir mal FormatDateTime an.

SaFu 11. Jul 2008 13:26

Re: problem beim Dateien löschen
 
Nochmal zu dem Punkt 1.

Habe ich glaube, hab ich doch nicht so verstanden, denn es soll auch in dem Timer alle Ordner der ShellTreeView durch gegeangen werden, wenn da eine Datei enthalten ist mit dem enstprechenden Dateinamen und Format und die älter ist mit der Eingestellten Zeit, dann soll gelöscht werden.

DeddyH 11. Jul 2008 13:29

Re: problem beim Dateien löschen
 
Das geht am besten rekursiv. Irgendwo in der DP geistert die Funktion Hier im Forum suchenFindAllFiles herum, die kannst Du ja als Ansatz nehmen und anpassen.

Luckie 11. Jul 2008 13:31

Re: problem beim Dateien löschen
 
Passen die Datenformate denn überhaupt zusammen?
Delphi-Quellcode:
if FileDateToDateTime(FileAge(ShellTreeView2.Path + '\Stats\Saga\' + SearchRec.Name)) < (Date - iTagevar)

SaFu 11. Jul 2008 13:36

Re: problem beim Dateien löschen
 
Ja in diesem Fall passt es zusammen und es funktionirt auch wunderbar.

Bei dieser Procedure ist halt nur das Problem das alles gelöscht wird.

Und wenn das Bild meiner Oma drin ist wird es auch irgendwann gelöscht, was es aber nicht so ausser es hat einen Dateinamen der so aufgebaut ist wie im Anhang.

DeddyH 11. Jul 2008 13:40

Re: problem beim Dateien löschen
 
Du hast doch 3 Kriterien, die es zu prüfen gilt:
1. Erstellungsdatum
2. Anfang des Dateinamens
3. Dateiendung

1. scheint ja schon zu klappen, für 2. kannst Du etwas in der Art
Delphi-Quellcode:
if Pos(FormatDateTime('yyyy mm dd',now),Rec.Name) = 1 then
versuchen, und für 3.
Delphi-Quellcode:
if AnsiLowerCase(ExtracFileExt(Rec.Name)) = Deine_Endung_in_Kleinschreibung then
. Sollte funktionieren ;)

Luckie 11. Jul 2008 14:03

Re: problem beim Dateien löschen
 
Ich würde mir einfach mal ein Flussdiagramm zeichnen. Bei komplexen Abläufen mit komplexeren Abfragen immer sehr hilfreich.

p80286 11. Jul 2008 15:06

Re: problem beim Dateien löschen
 
Hallo fuknersascha,

du schreibst, Du hättest folgende Probleme:
Zitat:

1. Es wird Immer nur im Ordner gelöscht den ich über die ShellTreeview ausgewählt habe.
2. Es werden auch Dateien nach der einegstellten Zeit gelöscht, die nicht gelöscht werden sollen. (z.b eine Notiz)
3. Es sollen nur Dateien gelöscht werden die nur das Datum + Dateiname haben
4. Ich möchte anhand des Datums aus dem Dateinamen diese Prüfung auf Alter der Datei vornehmen.

zu 1. Da gibt es Lösungen wie Sand am Meer ich meine in den Delphi Beispielen findest Du auch etwas dazu.

zu 2. Was heißt "nach" der eingestellten Zeit? Du vergleichst ja zwei "Datumse" ist "nach" dann "kleiner als" oder "größer als"? z.Zt löschst Du alles dessen Dateidatum kleiner als der Stichtag ist. (Minuten und Sekunden schenken wir uns mal)

zu 3. Welchen Dateinamen? Du suchst nach *.* und übergibst den gefundenen Dateinamen an Deine Löschroutine. Da ist hinterher das Verzeichnis ziemlich leer. Entweder du machst gleich beim Dateisuchen die richtige Einschränkung (*.BAK, LöDa*.*, *.?bd....) oder aber Du testest vor dem Löschen den Dateinamen auf Richtigkeit (#9DeddyH)

zu 4. Falls ein Datum im Dateinamen vorhanden ist, dann ist das etwas, was wie ein Datum aussieht, aber kein Datum ist! Für Zeitangaben gibt es ganz spezielle Typen und Strings gehörten bisher nicht dazu. Wenn du wirklich eine Datums-Darstellung im Dateinamen untergebracht hast, in welcher Beziehung steht diese dann zu dem "richtigen" Dateidatum?

Gruß
K-H

SaFu 15. Jul 2008 12:14

Re: problem beim Dateien löschen
 
Ich bin es nochmal wegen dem Problem ich komm da nicht so richtig weiter.

Es ist besser wenn ich versuche erstmal Punkt 1 zu lösen.

Und zwar möchte ich jeden Ordner in der ShellTreeView durchsuchen aber mit dem erweiterten pfad.

Delphi-Quellcode:
 ShellTreeView2.Path + '\Stats\Saga\ // in dem letzten Ordner liegen dann die Dateien
und da es ja auch mehr oder weniger Ordner werden können sollte es automatisch gehen, besser gesagt auf knopfdruck würde ich gerne alle Ordner durchgehen.

Muss ich das jetzt in eine Schleife legen??

SaFu 17. Jul 2008 09:22

Re: problem beim Dateien löschen
 
So hab ich jetzt geschaft

Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
Var iDurchlauf :Integer;
begin
 for iDurchlauf:= 1 to ShellTreeView2.Items.Count - 1 do
  begin
   ShellTreeView2.Select(ShellTreeView2.Items[iDurchlauf]);

  end;
end;
Es werden alle Ordner der ShellTreeView durchgegangen.

Und wie stelle ich es jetzt an, das ich heraus finde welche Ordner gelöscht werden können, stelle mir das irgendwie so vor:

Delphi-Quellcode:
for alle Dateien durchgehen do
if (2008 05 24 + *.*) < als z.b 90 Tage bitte löschen. // Vorne das ist die Datei(en)
So wie berechne ich das ganze jetzt das immer geprüft wird auf Alter des Dateinamens.

Es wäre echt nett wenn mir jemand helfen könnte, hänge jetzt schon 3 Wochen an dem Problem

Butch87 17. Jul 2008 10:33

Re: problem beim Dateien löschen
 
Zitat:

Zitat von fuknersascha
Alter des Dateinamens

was meinst du damit?!? das erstellungsdatum der datei?!
[dp]Wie kann ich Erzeugungsdatum einer Datei ermitteln ?[/dp]

SaFu 17. Jul 2008 10:51

Re: problem beim Dateien löschen
 
Danke ertmal das du mir Antwortest


Zitat:

Zitat von Butch87
Zitat:

Zitat von fuknersascha
Alter des Dateinamens

was meinst du damit?!? das erstellungsdatum der datei?!
[dp]Wie kann ich Erzeugungsdatum einer Datei ermitteln ?[/dp]

Nein das meine ich nicht damit funktioniert es ja auch schon

hab mal bissel weiter gemacht und das sieht jetzt so aus vielleicht erklärt das alles
Ich denke das ich auf dem richtigen weg bin

Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
Var iDurchlaufi,TageVar :Integer;
  SearchRec : TSearchRec;
 
begin
IiTageVar:= SpinEdit.Value; // Auswhl der Tage von 30-200

 for iDurchlauf:= 1 to ShellTreeView2.Items.Count - 1 do
  begin
   ShellTreeView2.Select(ShellTreeView2.Items[iDurchlauf]);
    AbDatumloeschen:= FormatDateTime('yyyy mm dd',Date- iTagevar);
    Label10.Caption:= (AbDatumLoeschen);

     if findfirst(ShellTreeView2.Path +'\Stats\Saga\'+ AbDatumLoeschen + ' *.*',faAnyFile,SearchRec) = 0 then
      begin
       showmessage(ShellTreeView2.Path +'\Stats\Saga\'+ AbDatumLoeschen + SearchRec.Name);
       DeleteFile(ShellTreeView2.Path +'\Stats\Saga\'+ AbDatumLoeschen + SearchRec.Name);
      end;
   end;
end;
jetzt habe ich das problem das mir das Datum im Dateiname 2 mal angezeigt wird

Butch87 17. Jul 2008 11:15

Re: problem beim Dateien löschen
 
dann liegt das doch wohl am erstellen der dateien (dateiname) und nicht am löschen!!
erstellt der user die dateien selbst oder erstellst du die (dann zeig doch mal den code davon)??

SaFu 17. Jul 2008 11:48

Re: problem beim Dateien löschen
 
die Datei erzeugt ein Server und das Tag für Tag

jetzt Funktioniert das löschen auch schon da die richtige Datei gefunden wird
Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
Var iDurchlauf :Integer;
  SearchRec : TSearchRec;
begin
 for iDurchlauf:= 1 to ShellTreeView2.Items.Count - 1 do
  begin
   ShellTreeView2.Select(ShellTreeView2.Items[iDurchlauf]);
    AbDatumloeschen:= FormatDateTime('yyyy mm dd',Date- iTagevar) ;
    Label10.Caption:= (AbDatumLoeschen);

     if findfirst(ShellTreeView2.Path +'\Stats\Saga\'+ AbDatumLoeschen + '*.*',faAnyFile,SearchRec) = 0 then
      begin
       repeat
        showmessage(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
        DeleteFile(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);

       until
       FindNext(SearchRec) <> 0;
      end;
   end;
end;
Soweit hab ich es jetzt nur 1 geht noch nicht

Wie mache ich es das alle Dateien die < als "AbDatumloeschen" sind gelöscht werden

nahpets 17. Jul 2008 13:30

Re: problem beim Dateien löschen
 
Hallo,

dann darfst Du (leider) nur mit *.* suchen und musst den Vergleich auf kleiner/gleich mit dem Dateinamen durchführen,
d. h.: Für jede gefundenen Datei abfragen, ob SearchRec.Name < AbDatumloeschen ist.
Wenn der Dateiname immer in der Form YYYY MM DD ist, mag das sogar mit einem Stringvergleich funktionieren.

Delphi-Quellcode:
     if findfirst(ShellTreeView2.Path +'\Stats\Saga\*.*',faAnyFile,SearchRec) = 0 then
      begin
       repeat
        if SearchRec.Name < AbDatumloeschen then
         begin
          showmessage(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
          DeleteFile(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
         end;
       until
       FindNext(SearchRec) <> 0;
      end;
Stephan

SaFu 17. Jul 2008 13:40

Re: problem beim Dateien löschen
 
Danke genau das war es

Überprüft etwa SearchRec auch nur teilstrings???

nahpets 17. Jul 2008 14:26

Re: problem beim Dateien löschen
 
Hallo,

SearchRec prüft garnichts, dort sind immer der zuletzt von FindFirst und FindNext gefundene Dateiname und die übrigen Dateiinformationen enthalten.

Na, in meinem Quelltext oben war eine kleine "Unschärfe". Es soll ja ab AbDatumloeschen (also einschließlich) gelöscht werden, daher muss es

Delphi-Quellcode:
if SearchRec.Name <= AbDatumloeschen then
 begin
  showmessage(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
  DeleteFile(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
end;
und nicht

Delphi-Quellcode:
if SearchRec.Name < AbDatumloeschen then
 begin
  showmessage(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
  DeleteFile(ShellTreeView2.Path +'\Stats\Saga\'+ SearchRec.Name);
end;
heißen.

Stephan

SaFu 17. Jul 2008 14:30

Re: problem beim Dateien löschen
 
Danke schön genau richtig erkannt :-D

vielen Danke für die Mühe


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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