Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dateien löschen (https://www.delphipraxis.net/62441-dateien-loeschen.html)

blauglaser 4. Feb 2006 16:42


Dateien löschen
 
Hallo zusammen,
Anfänger braucht wieder Hilfe es handelt sich darum Dateien zu löschen die ein bestimtes Datum haben.
Das zu vergleichende Datum wird in 3 Edit Felder eingegeben

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  MyYear, MyMonth, MyDay :integer;
  MyDate: TDateTime;
 
begin
MyYear := StrToInt(Edit3.Text);
MyMonth := StrToInt(Edit4.Text);
MyDay := StrToInt (Edit5.Text);
MyDate := EncodeDate(MyYear,MyMonth,MyDay);
if
//Wie kann ich hier das Datum der Dateien mit dem eingegebenen Datum verleichen
then
               begin
                        DeleteFile(ListBox1.Items.strings[0]);//Wie kann man hier dann alle Dateien löschen und nicht nur eine
               end;

end;
Zuerst wird mit FindFirst und FindNext nach Dateien gesucht diese werden dann an eine Listbox übergeben wie kann ich jetzt das Dateidatum der Dateien in der Listbox ermitteln und mit dem Datum vergleichen dass ich in die Editfelder eingegeben habe es sollen daraufhin alle Dateien mit Delete gelöscht werden deren Datum älter ist als das eingegebene.

Ein kleines Beispiel wäre toll.

Gruss
Ralf

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

marabu 4. Feb 2006 17:04

Re: Dateien löschen
 
Hallo Ralf,

wenn du die Dateien mit FindFirst() und seinen Verwandten anhand einer Namensangabe aus dem Dateisystem angelst, dann erhältst du als Beigabe die timestamps in der Struktur SearchRec.FindData. Die Zeiten kannst du dann mit FileDateToDateTime() in das Delphi-Format umwandeln und dann mit beliebigen TDateTime-Werten vergleichen. Bei Datumsvergleichen bedenke, dass du nur den ganzzahligen Anteil von TDateTime-Werten berücksichtigen darfst.

Wenn du nur anhand eines Dateinamens auf das Datum der Datei zugreifen möchtest, dann hilft dir FileAge() weiter. Auch hier muss FileDateToDateTime() nachgeschaltet werden.

Wenn du mehrere Dateien löschen willst, deren Namen in deiner ListBox vermerkt sind, dann kannst du eine Schleife verwenden:

Delphi-Quellcode:
with ListBox do
  for i := 0 to Pred(Items.Count) do
    DeleteFile(Items[i]);
Grüße vom marabu

blauglaser 4. Feb 2006 20:15

Re: Dateien löschen
 
Hallo,
irgendwas mach ich total falsch kann mir jemand weiterhelefen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

Var
path, Mask :String;
MyYear,MyMonth,MyDay:integer;
Datefile :String;
MyAge,FilDat,FilDat1 :TdateTime;


begin
path := Edit1.text;
Mask := Edit2.text;
MyYear := StrToInt (Edit3.Text);
MyMonth := StrToInt (Edit4.Text);
MyDay := StrToInt (Edit5.Text);
MyAge := EncodeDate(myYear, myMonth, Myday);
Datefile := FindFiles (path, Mask, True);//hier wir aus FindFirst und FindNext übergeben
FilDat := FileAge(Datefile);
if Fildat = MyAge
//if Date FileDateToDateTime (FileAge (Datefile))= MyAge Then
//if (Date(FileDateToDateTime(Datefile)) = MyAge)
then
               begin
                        DeleteFile(Datefile);
               end;



end;
Bis Datefile läuft alles die Datei wird an Datefie übergeben aber das mit dem Datum vergleichen kapier ich nicht.

Gruss und Danke
Ralf

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

marabu 4. Feb 2006 22:07

Re: Dateien löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Ralf,

wenn du deinen Code im Beitrag mit [ delphi] und [ /delphi] (ohne die Leerzeichen) einrahmst, dann sieht er viel besser aus. Oder selektiere ihn und klicke auf den Button Delphi-Code in der Werkzeugleiste des Beitragseditors.

Im Anhang habe ich dir eine kleine Demo gebastelt, die dir zeigt, wie du das Datum einer Datei mit FileAge() besorgst und mit vorgegebenen Datumswerten vergleichst. In der ListBox werden alle Dateien markiert, die zwischen den ausgewählten Datumswerten (inklusiv) liegen.

In deinem Code vermute ich einen Fehler bei FindFiles() - eventuell wird kein String zurückgegeben, sondern irgendeine Liste.

Freundliche Grüße vom marabu

SirThornberry 4. Feb 2006 22:48

Re: Dateien löschen
 
ich hab die Vermutung das bei ihm der Vergleich des Datums fehl schlecht. Er vergleicht die Datumswerte direkt und nicht nur den Teil vor dem Komma oder mit der entsprechenden Funktion. Da aber 3.5 nicht unbedingt 3.5 ist (wenn es in zwei variablen verglichen wird) schlägt das ganze fehl.

blauglaser 5. Feb 2006 11:22

Re: Dateien löschen
 
:wall: Hallo zusammen,
also ein Stück weiter bin ich gekommen das löschen der Datei wird nicht gleich übersprungen aber es kommt die Meldung "ungültiges Argument in Datumscodierung" aus FindFiles wir z.B. "test.txt" an die Variable übergeben dann wandle ich die Variable mit
Delphi-Quellcode:
Datefile := FindFiles (path, Mask, True);
FilDat := (FileDateToDateTime(FileAge(Datefile)));
um MyAge ist ja vom Typ TDateTime dann will ich mit:
Delphi-Quellcode:
if (FilDat <= MyAge)
vergleichen ob FilDat kleiner oder gleich MyAge ist wen ja
Delphi-Quellcode:
then
fi:=DateTimeToStr(FilDat);
begin
DeleteFile(fi);
end;
soll die Datei gelöscht werden.
Das mit der Listbox habe ich mal ganz rausgenommen sonst geht mir der Überblick verloren (wenn es nicht schon so weit ist)

Gruss und einen schönen kalten Sonntag
Ralf

Waldteufel 5. Feb 2006 11:38

Re: Dateien löschen
 
Hi blauglaser.

Wenn schon, dann so:
Delphi-Quellcode:
Datefile := FindFiles (path, Mask, True);
FilDat := (FileDateToDateTime(FileAge(Datefile)));
if (FilDat <= MyAge) then
begin
  fi := DateTimeToStr(FilDat);
  DeleteFile(fi);
end;
Dein Code löscht nämlich die Datei immer, speichert den richtigen Dateinamen aber nur, wenn FilDat <= MyAge, in fi ab; Ergo -> Wirrwarr.

Schau dir ggf. auch mal das hier an: http://www.dsdt.info/grundlagen/spra...zweigungen.php

[edit: Fipptehler ]

blauglaser 5. Feb 2006 11:53

Re: Dateien löschen
 
Super Danke,
aber die Fehlermeldung bleibt da ja etwas mit dem Datum falsch ist.

Gruss
Ralf

SirThornberry 5. Feb 2006 14:20

Re: Dateien löschen
 
bevor das ganze hier noch ewig dauert - hier eine procedure welche dir alle Dateien in eine Liste vom Typ TStrings packt, die vor einem bestimmten Datum das letzte mal geschrieben/geändert wurden.
Delphi-Quellcode:
procedure FindWrittenBeforeDate(AMask: String; ADate: TDateTime; ADest: TStrings);
  function LConfFileTimeToDateTime(const AFileTime: TFileTime): TDateTime;
  var LTime: TSystemTime;
  begin
    FileTimeToSystemTime(AFileTime, LTime);
    with LTime do
      result := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
  end;
var LSearchRec: TSearchRec;
begin
  ADest.BeginUpdate;
  if FindFirst(AMask, faAnyFile, LSearchRec) = 0 then
  begin
    repeat

      if (LSearchRec.Attr and faDirectory = 0) and
         (Trunc(LConfFileTimeToDateTime(LSearchRec.FindData.ftLastWriteTime)) < Trunc(ADate)) then
          ADest.Add(LSearchRec.Name);
    until FindNext(LSearchRec) <> 0;
  end;
  ADest.EndUpdate;
end;
Beispielaufruf um alle Dateien aus "c:\temp" zu finden die vor dem aktuellen tag das letzte mal geändert wurden.
Delphi-Quellcode:
  FindWrittenBeforeDate('c:\temp\*', Date, Memo1.Lines);

blauglaser 5. Feb 2006 15:17

Re: Dateien löschen
 
Danke für die Mühe,
und sorry wußte nicht das es nicht gerne gesehen ist wenn zuviele wahrscheinlich dumme Fragen gestellt werden.


Gruss
Ralf

PS. werde trotzdem versuchen den Fehler in meinem Code zu finden

SirThornberry 5. Feb 2006 15:54

Re: Dateien löschen
 
Zitat:

Zitat von blauglaser
Danke für die Mühe,
und sorry wußte nicht das es nicht gerne gesehen ist wenn zuviele wahrscheinlich dumme Fragen gestellt werden.

Das stimmt doch nicht, dumme Frage gibt es nicht und je mehr Fragen du stellst destso mehr sieht man das du auch was lernen willst. Ich hatte nur die Befürchtung das es zum Stillstand gekommen ist und es einfach nicht weiter geht.
Desweiteren muss ich zugeben das ich mir den Source von dir nicht angesehen hab da es eben meist schneller geht so etwas selbst neu zu basteln. Aus deiner Sicht ist es jedoch besser den Fehler zu finden um etwas zu lernen.

blauglaser 5. Feb 2006 16:10

Re: Dateien löschen
 
:) Danke!

Wenn jemand noch eine Idee hat wo der Fehler liegt würde ich mich freuen.

Gruss
Ralf

marabu 5. Feb 2006 16:23

Re: Dateien löschen
 
Hallo Ralf,

rätselhaft ist, weil du es noch nicht erklärt hast, warum du zwar die Datei, deren Name in der Variable DateFile steht, überprüfst, aber dann eine Datei zu Löschen versuchst, deren Name dem Timestamp der überprüften Datei entspricht. Die Datumswandlungen funktionieren ansonsten allesamt bei mir. Wenn du da noch Probleme siehst, dann solltest du ein Stück zusammenhängenden Code posten, an dem man dein Problem nachvollziehen kann. Und bei Fehlern musst du unmissverständlich die Stelle im Code bezeichnen und den Wortlaut der Fehlermeldung wiedergeben. So werden deine Probleme viel schneller gelöst.

Freundliche Grüße

marabu

blauglaser 5. Feb 2006 18:11

Re: Dateien löschen
 
Hallo Marabu,
also als Fehlermeldung kommt "Ungültiges Argument zum codieren des Datums" wenn ich das Programm in Einzellschritten durchlaufe bleibt es bei "
Delphi-Quellcode:
if FileDateToDateTime(FileAge(DateFile)) <= MyAge thenif FileDateToDateTime(FileAge(DateFile)) <= MyAge then
stehen wenn ich dann FileDateToDateTime vor FileAge entferne läuft das Programm auf
Delphi-Quellcode:
DeleteFile(Datefile);
aber die Datei wird nicht gelöscht.
Den Code für FindFile habe ich im Netz gefunden und nachträglich das Result zum testen abgeändert damit die Datei an eine Variable übergeben wird.
Delphi-Quellcode:
function FindFiles (aPath, aFindMask: String; aWithSub: Boolean):String;
Var
  FindRec: tSearchRec;
  Dat: String;
Begin
  // Wenn die Stringliste nil ist oder aPath oder aFind nicht angegeben ist
  // dann raus
  If (aPath = '') or (aFindMask = '') Then
    Exit;


  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  // (Oder die Funktion IncludeTrailingPathDelimiter aus der Unit SysUtils.pas verwenden)
  If aPath[Length (aPath)] <> '\' Then
    aPath := aPath + '\';


  // Im aktuellen Verzeichnis nach der Datei suchen
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // ...Ergebnis in die Stringlist einfügen
        Dat:= FindRec.Name;
        Result:=Dat;
    Until FindNext (FindRec) <> 0;


  FindClose (FindRec);


  // Wenn nicht in Unterverzeichnissen gesucht werden soll dann raus
 // If Not aWithSub Then
   // Exit;

 
  // In Unterverzeichnissen weiter suchen
 // If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then
   // Repeat
     // If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // Feststellen, ob es sich um ein Verzeichnis handelt
       // If Boolean (FindRec.Attr and faDirectory) Then
          // Funktion erneut aufrufen, um Verzeichnis zu durchsuchen (Rekursion)
         // FindFiles (aPath + FindRec.Name, aFindMask, aWithSub, aResult);
//    Until FindNext (FindRec) <> 0;


  // FindClose (FindRec);
End;


{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);

Var
path, Mask :String;
MyYear,MyMonth,MyDay:integer;
Datefile:String;
MyAge:TDateTime;



begin
path := Edit1.text;
Mask := Edit2.text;
MyYear := StrToInt (Edit3.Text);
MyMonth := StrToInt (Edit4.Text);
MyDay := StrToInt (Edit5.Text);
MyAge := EncodeDate(myYear, myMonth, Myday);
Datefile := FindFiles (path, Mask, True);
if FileDateToDateTime(FileAge(DateFile)) <= MyAge then
begin
DeleteFile(Datefile);
end;
end;


end.
ich hoffe das mit dem Einfügen des Quelltextes ist so Ok

freundliche Grüsse
Ralf

marabu 5. Feb 2006 18:55

Re: Dateien löschen
 
Ralf, schau bitte mal in deine Online-Hilfe. Eventuell hat sich seit Delphi 3 einiges an den Signaturen geändert. Prüfe ob FileAge() und FileDateToDateTime() überhaupt in der Weise verwendet werden können, wie es dir hier mehrfach vorgeschlagen wurde. Unter den neueren Delphi-Versionen lässt sich der Code problemlos kompilieren.

marabu

blauglaser 5. Feb 2006 19:13

Re: Dateien löschen
 
Marabu, hat ich mir auch schon überlegt und die Version 5 die es kostenlos zum Download gibt heruntergeladen aber es passiert das gleiche.
Es ist doch richtig dass die Datei aus FindFile als String übergeben wird und dann mit
Delphi-Quellcode:
if FileDateToDateTime(FileAge(DateFile)) <= MyAge then
nach TDateTime umgewandelt werden muss damit der Vergleich mit MyAge durchgeführt werden kann.


Gruss
Ralf

SirThornberry 5. Feb 2006 20:51

Re: Dateien löschen
 
die Datei bei FindFirst etc. ist aber ohne Pfadangabe, vielleicht ist das der Fehler. Im übrigen wird bei FindFirst etc. bereits das Dateitatum mit geliefert. Wie man dieses wandelt findest du in dem Stückchen was ich gepostet hab.

marabu 6. Feb 2006 07:54

Re: Dateien löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen Ralf,

dein syntaktisches Problem mit der Funktion FileDateToDateTime() hat mich veranlasst deinen Code mit Delphi2 nachzustellen. Im Anhang findest du das Projekt, welches bei mir problemlos kompiliert und auch das tut was es soll. Das Löschen simuliere ich dabei aber nur.

Deine Funktion FindFiles() ist irgendwie nicht sehr durchdacht und sieht aus, als hättest du sie irgendwo gefunden und verschlimmbessert. Ich habe sie neu geschrieben. Sie durchsucht nur das angegebene Verzeichnis, keine Unterverzeichnisse. Dadurch bleibt die Funktion klein und übersichtlich:

Delphi-Quellcode:
function FindFiles (
  const fileExpr: String; // vollständiger Dateiname mit wildcards
  const files: TStrings   // Ergebnisliste mit vollst. Namen
): Boolean;               // Erfolgreich bei true
var
  sr: TSearchRec;
  path: String;
begin
  Result := true;
  files.Clear;
  files.BeginUpdate;
  path := ExtractFilePath(fileExpr);
  if FindFirst(fileExpr, faArchive, sr) = 0 then
  begin
    repeat
      files.Add(path + sr.Name);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end else Result := false;
  files.EndUpdate;
end;
Freundliche Grüße vom marabu

blauglaser 6. Feb 2006 18:22

Re: Dateien löschen
 
:-D Hallo alle zusammen,
jetzt geht es der Pfad hat noch gefehlt.

Nochmals Danke an alle für die tolle Hilfe und Mühe die Ihr euch gemacht habt

Gruss

Ralf


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.

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