Supportnet / Forum / Anwendungen(Java,C++...)
Delphi: Filelistbox und Directorylistbox
Frage
Hallo!
Ich lerne Delphi 7 gerade in der Schule und bin noch Anfänger, habe aber schon mit anderen Sprachen gearbeitet.
Zu meinem Problem:
Ich möchte ein Programm schreiben, das Ordner auf Dateien untersucht, die eine bestimmte, vorher festgelegte Dateigröße überschreiten und sie anzeigt und gegebenenfalls löscht.
Das Programm besitzt schon die gewünschten Funktionen, aber eine Sache ist da noch ;) :
Das Programm kann bis jetzt nur einzelne Ordner durchsuchen (directorylistbox1 gibt daten an filelistbox1 weiter und dann wird die filelistbox1 durchsucht).
Ich möchte das jetzt so machen, das man einen Ordner in der directorylistbox1 anklickten kann, wodurch eine unsichtbare filelistbox erstellt wird. Danach sollen alle FileListBoxen durchsucht werden.
Geht das überhaut? Oder gibt es bessere Lösungen?
Mein Problem ist vielleicht auch nur das ich die Funktion, die die Dateigrößen überprüft, nicht verstehen (die hab ich im Internet gefunden). Sie ist für Filelistboxen zugeschnitten:
[code] function GetFileSize(const szFile: String): Int64;
var
fFile: THandle;
wfd: TWIN32FINDDATA;
begin
result := 0;
if not FileExists(szFile) then exit;
fFile := FindFirstfile(pchar(szFile),wfd);
if fFile = INVALID_HANDLE_VALUE then exit;
result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
windows.FindClose(fFile);
flsz := result;
end;[/code]
Ich führe die Funktion in einer FOR-Schleife aus. In dieser Schleife gehe ich jeden Eintrag in der Listbox durch, und fülle so meine Tabelle:
[code] procedure TForm1.Button3Click(Sender: TObject);
var i, zeile: integer;
begin
StringGrid1.RowCount := FileListBox1.Items.Count;
zeile := 0;
FOR i := 0 to (FileListBox1.Items.Count - 1)
DO BEGIN
//Größe jeder Datei berechnen
getfilesize(FileListBox1.Items.Strings[i]);
sleep(10);
//Werte in Tabelle eintragen
IF flsz > maxwert
THEN BEGIN
StringGrid1.Cells[0,zeile] := IntToStr(zeile+1);
StringGrid1.Cells[1,zeile] := FileListBox1.Items.Strings[i];
StringGrid1.Cells[2,zeile] := IntToStr(flsz);
//StringGrid1.Cells[4,zeile] := IntToStr(i+1);
zeile := zeile + 1;
END;
END;
//Tabellengrösse trimmen / Tabelle anzeigen
StringGrid1.RowCount := zeile;
StringGrid1.Visible := true;
Label2.Caption := IntToStr(zeile);
end;[/code]
Wie kann ich denn jetzt mehrere Ordner auf eimal durchsuchen?
Bitte helft mir!! Danke ;)
Antwort 1 von TeRealWhistler
Hi,
Du fragts wie?
Rekursiv.
Iterativ geht auch aber ist umständlicher.
Also wenn du feststellst, dass ein Eintrag in der FileListBox das Verzeichniss-Attribut hat, sprich ein Ordner ist, muss du rekursiv den unterordner ebenfalls durchsuchen u.s.w..
Wenn das implementiert ist kannst du in deiner DirectoryListBox einen Start-Ordner auswählen und alle seine Datien und alle seine Unterordner mit samt ihren Dateien bearbeiten.
Oder habe ich deine Frage nicht ganz richtig verstanden????
Ciao
Andreas
Du fragts wie?
Rekursiv.
Iterativ geht auch aber ist umständlicher.
Also wenn du feststellst, dass ein Eintrag in der FileListBox das Verzeichniss-Attribut hat, sprich ein Ordner ist, muss du rekursiv den unterordner ebenfalls durchsuchen u.s.w..
Wenn das implementiert ist kannst du in deiner DirectoryListBox einen Start-Ordner auswählen und alle seine Datien und alle seine Unterordner mit samt ihren Dateien bearbeiten.
Oder habe ich deine Frage nicht ganz richtig verstanden????
Ciao
Andreas
Antwort 2 von b.ray
Doch, doch...
Ich mach das jetzt mit FindFirst, FindNext und FindClose. Mit einer Schleife suche ich die sozusagen tiefste Ebene und gebe das Verzeichniss an meine filelistbox weiter. dann wird dieser pfad gespeichert, damit er nicht erneut aufgerufen wird.
Ich mach das jetzt mit FindFirst, FindNext und FindClose. Mit einer Schleife suche ich die sozusagen tiefste Ebene und gebe das Verzeichniss an meine filelistbox weiter. dann wird dieser pfad gespeichert, damit er nicht erneut aufgerufen wird.

