Entwickler-Ecke
Dateizugriff - Anzeige von Dateien aus Ordnern mit Kriterium
Vamos - Di 27.10.09 20:35
Titel: Anzeige von Dateien aus Ordnern mit Kriterium
Hallo Liebe Delphi Gemeinde,
ich muss meine Frage noch einmal separiert von Threads die nur das Thema ankratzen stellen.
Ich schreibe z.Zt. ein Programm, welches Dateien aus bestimmten Ordnern anzeigen (später löschen - macht beim Testen nicht ganz so viel Spaß ;) ) soll.
Klappt soweit auch alles wunderbar, NUR die Filterbdeingung mit dem Erstellungsdatum scheint nicht zu greifen... Bin am verzweifeln, irgendwas überseh ich nur was?
Hier zum nachvollziehen mal der Kot : )
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| function GetCreationTimeOfFile(const AFileName: string): TDateTime; var SR: TSearchRec; SystemTime: TSystemTime; NewCreationTime: TFileTime; begin Result:=0; if FindFirst(AFileName, faAnyFile, SR)=0 then try if (Windows.FileTimeToLocalFiletime(SR.FindData.ftCreationTime, NewCreationTime) and Windows.FileTimeToSystemTime(NewCreationTime, SystemTime)) then Result:=Encodedate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay) + Encodetime(SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds); finally SysUtils.FindClose(SR) end; end;
procedure TForm1.Beenden1Click(Sender: TObject); begin close; end;
procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: string); var SR: TSearchRec; a: TDateTime; Lnewdate: TLabel; Etest: TEdit; begin Lnewdate.caption := DateToStr(a); if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat begin if GetCreationTimeOfFile(Directory + SR.Name) > a then List.Add(Directory + SR.Name) end; until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Danke vielmals!
Lannes - Di 27.10.09 20:49
Hallo,
zu der lokalen Variable a: : TDateTime; fehlt die Initialisierung.
Vamos - Di 27.10.09 21:06
Lannes hat folgendes geschrieben : |
Hallo,
zu der lokalen Variable a: : TDateTime; fehlt die Initialisierung. |
Vielen Dank für die schnelle Antwort, aber ist die Variable nicht initialisiert? Also deklariert ist Sie und ich dachte durch Lnewdate.caption := DateToStr(a); würde ich sie initialisieren... Tue ich das nicht? Was fehlt? Danke im Voraus.
Hobby-Programmierer - Di 27.10.09 21:44
So hab das jetzt mal von hier umgeschrieben.
http://www.delphi-forum.de/viewtopic.php?p=582688#582688
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| procedure GetFilesInDirectory( Directory: string; const Mask: string; const ATime: TDate; List: TStrings; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: string); var SR: TSearchRec; SystemTime: TSystemTime; FN: string; FS: String; FD: TDate; begin if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat if FileTimeToSystemTime(sr.FindData.ftCreationTime, SystemTime) then FD:= SystemTimeToDateTime(SystemTime) else FD:= 0.0; FN:= Directory + SR.Name; FS:= inttostr(sr.Size); if FD > ATime then List.Add(FN+ ' # '+ FS+ ' # '+ DateToStr(FD)); until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; Directory:= IncludeTrailingPathDelimiter(Directory); ScanDir(Directory); finally List.EndUpdate; end; end; |
Zeigt Dateien die in den letzten 10 Tage erstellt wurden
Delphi-Quelltext
1:
| GetFilesInDirectory('p:', '*.*', (now -10), memo1.Lines, true, true); |
Vamos - Di 27.10.09 21:52
Vielen Dank Dir!
mein Aufruf sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.BdelClick(Sender: TObject); var s1, s2, s3, s4, s5, s6, s7, sLoeschlog :string; a: TDateTime; f: textfile; begin Lheute.Caption := DateToStr (date); a:=StrToInt(EAlter.text); Lnewdate.caption :=DateToStr(date-a);;
s1 := EPath1.text; GetFilesInDirectory(s1, '*.*', (now), Listbox1.Items, True, True); ProgressBar1.position:=ProgressBar1.position+14; ... |
Leider sagt er mir da inkompatibe Typen...
Hobby-Programmierer - Di 27.10.09 22:00
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Du vermischt aber auch alles. Maxh doch erstmal eins nach dem anderen
[edit] dir ist aber bewusst das er jetzt nur Dateien anzeigt, die
Heute erstellt wurden?
Vamos - Di 27.10.09 22:15
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Habs rausgefunden, hatte oben was vergessen :autsch:
Vielen Dank!!! Aber irgendwas stimmt noch nicht... obwohl ich das geändert habe:
Findet er die heutigen Dateien nur, wenn ich now-1 rechne... O.o
Hobby-Programmierer - Di 27.10.09 22:22
Delphi-Quelltext
1:
| if FD > (ATime -1) then |
Ein wenig mitdenken musst du aber auch noch. C & P allein reicht net :roll:
Vamos - Di 27.10.09 22:50
Hobby-Programmierer hat folgendes geschrieben : |
Delphi-Quelltext 1:
| if FD > (ATime -1) then |
Ein wenig mitdenken musst du aber auch noch. C & P allein reicht net :roll: |
Glaube bin kurz davor mir meinen gesamten Sourcecode zu versauen : ( *wenn man das noch kann*
Jetzt zeigt er mit NUR noch Einträge von heute...
Delphi-Quelltext
1: 2: 3: 4:
| if FD > (ATime-1) then List.Add(FN+ ' # '+ FS+ ' # '+ DateToStr(FD)); until FindNext(SR) <> 0; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.BdelClick(Sender: TObject); var s1, s2, s3, s4, s5, s6, s7, sLoeschlog :string; a, b: TDateTime; f: textfile; begin Lheute.Caption := DateToStr (date); a:=StrToint(EAlter.text); Lnewdate.caption :=DateToStr(date-a);
s1 := EPath1.text; GetFilesInDirectory(s1, '*.*', (now-a), Listbox1.Items, True, True); ProgressBar1.position:=ProgressBar1.position+14; s2 := EPath2.text; GetFilesInDirectory(s2, '*.*', (now-a), Listbox2.Items, True, True); ProgressBar1.position:=ProgressBar1.position+14; |
Irgendwo sag ich dem Programm das ja, aber wo?
Oben nimmt er nur Dateien, die größer, sprich Älter als heute sind.
Unter m.E. auch.
Also bei EAlter = 0 müsste ich aber ALLE Dateien inkl der von heute sehen, bei EAlter = 1 nur noch die von Gestern und davor .. usw.
Bitte nochmal um Rat
Vamos - Di 27.10.09 23:17
Hobby-Programmierer hat folgendes geschrieben : |
Delphi-Quelltext 1:
| if FD > (ATime -1) then |
Ein wenig mitdenken musst du aber auch noch. C & P allein reicht net :roll: |
Da war mein und Dein Denkfehler. Wenn FD > Heute, dann gibt es sie nich gar nicht, wenn FD < Heute, liegt sie in der Vergangenheit..
jetzt gehts jedenfalls, nochmals vielen Dank!
Hobby-Programmierer - Mi 28.10.09 00:02
(FD > Heute -1) ist logischerweise das gleiche wie (FD = Heute)
Zitat: |
Also bei EAlter = 0 müsste ich aber ALLE Dateien inkl der von heute sehen, bei EAlter = 1 nur noch die von Gestern und davor .. usw. |
Falsch. Bist du sicher das du die Programmlogik richtig verstanden hast?
Bei Now - 0 zeigt er nur die Dateien von heute,
bei Now - 1 nur die Dateien von Gestern und heute ...
Es werden die Dateien angezeigt die am = > ATag bis heute erstellt wurden.
Wenn du eine andere Logik brauchst, musst du das natürlich umstellen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!