AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien suchen

Ein Thema von TheReaper · begonnen am 25. Apr 2003 · letzter Beitrag vom 25. Apr 2003
Antwort Antwort
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#1

Dateien suchen

  Alt 25. Apr 2003, 11:48
Hallo erstmal!

Hab mal wieder ne frage. Aber dafür seit ihr ja da!

Also: Ich will ein Programm schreiben bei dem alle *.exe-, *rar-, *zip-, usw. -dateien gefunden werden müssen. Dabei weiß ich nicht wieviel Ordner, Unterordner und dateien da sind. Die gefundenen Dateien sollen in einem TListview angezeigt werden und bei bedarf auch gestartet. Wie das starten funzt weiß ich.
In Kurzform: Wie kann ich die Dateien mit unbekannten Ordner und Dateinamen finden?

Schonmal Danke voraus!!
MFG TheReaper
  Mit Zitat antworten Zitat
Benutzerbild von Mirilin
Mirilin

Registriert seit: 21. Dez 2002
Ort: Lenzburg
861 Beiträge
 
Delphi 6 Professional
 
#2
  Alt 25. Apr 2003, 11:53
Zitat:
Rekursiv nach Dateien suchen


Um nach bestimmten Dateien auf der Festplatte zu suchen muss man die Funktionen FindFirst und FindNext benutzen. Wenn man nur nach Dateien in einem Verzeichnis suchen möchte ist dies sehr einfach. Man sucht einfach mit FindFirst nach der ersten Datei und startet dann eine Repeat-Schleife. Am Ende eines jeden Durchlaufs wird die nächste Datei in dem Verzeichnis gesucht (FindNext).

Etwas komplizierter wird die Sache, wenn man auch in Unterverzeichnissen nach Dateien suchen möchte. Dann muss sich die Funktion nämlich selbst aufrufen - immer genau dann, wenn ein Verzeichnis gefunden wurde. Dies nennt man rekursiv.

In der untenstehenden Procedure wurde der gesamte Aufruf gekapselt. Die Procedure erwartet vier Parameter:

- Das Verzeichnis (z.B. 'C:\Programme')
- Die Suchmaske (z.B. '*.*' oder '*.doc')
- Die Ausgabeliste (z.B. Listbox1.Items)
- Rekursive Suche (bei True werden die Verzeichnisse rekursiv durchsucht, also mitsamt allen Unterverzeichnissen, bei False wird nur das angegebene Verzeichnis durchsucht).


procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
var
SR: TSearchRec;
begin
if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
ADirectory:=ADirectory+'\';

if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then begin
repeat
if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then
AList.Add(ADirectory+SR.Name)
until FindNext(SR)<>0;
FindClose(SR);
end;

if ARekursiv then
if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
begin
repeat
if (SR.Name<>'.') and (SR.Name<>'..') then
GetFilesInDirectory(ADirectory+SR.Name,AMask,AList ,True);
until FindNext(SR)<>0;
FindClose(SR);
end;
end;

Ein Beispielaufruf könnte so aussehen:

procedure TForm1.Button1Click(Sender: TObject);
begin
GetFilesInDirectory('C:\','*.*',Listbox1.Items,Fal se);
end;

In diesem Beispiel werden alle Dateien (*.*) im Verzeichnis 'C:\' in 'Listbox1.Items' gesteckt. Unterverzeichnisse werden nicht durchsucht (False).


FindFirst

Das Kernstück dieser Procedure ist eigentlich der Aufruf von FindFirst. Diese Funktion sucht nach der ersten Datei im angegebenen Verzeichnis.

Sie erwartet drei Pramater.

- Pfad + Suchmaske
- Dateiattribut
- Referenzparameter vom Typ TsearchRec

Pfad und Suchmaske sollten klar sein (z.B. C:\*.*). Der zweite Parameter kann folgende Werte annehmen:

faReadOnly Schreibgeschützte Datei
faHidden Versteckte Datei
faSysFile Systemdatei
faVolumeID Laufwerks-ID-Datei
faDirectory Verzeichnis
faArchive Archivdatei
faAnyFile Beliebige Datei

Der Parameter gibt an, welche Dateien mit welchem Dateiattribut gesucht werden sollen. Auch kann auf diese Weise nach Verzeichnissen gesucht werden können.

Dem dritten Parameter werden letztendlich bei einem Sucherfolg die Dateiinformationen übergeben:

type
TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

Auf diese Weise kommt man auch an den eigentlichen Dateinamen, die Dateigröße oder an das Erstellungsdatum:

Procedure Tform1.Button1Click(Sender: Tobject);
var
F: TSearchRec;
begin
if FindFirst(ed_dateiname.text,faAnyFile,F)=0 then
begin
Label1.Caption:=F.Name
Label2.Caption:=IntToStr(F.Size);
FinClose(F);
End;
End;

FindNext setzt einfach nur das Filehandle auf die nächste entsprechende Datei. Wieder muss die Variable vom Typ TsearchRec als Referenzparameter übergeben werden.

Da beim Aufruf von FindFirst usw. Ressourcen belegt werden, müssen sie wieder freigegeben werden. Dies geschieht mit dem Aufruf von FindClose.

--
Name: Philipp Frenzel
E-Mail: webmaster@delphi-treff.de
Homepage: http://www.delphi-treff.de
aus der EDH
Tobias
Die Physik ist für die Physiker eigentlich viel zu schwer.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Dateien suchen

  Alt 25. Apr 2003, 11:56
Zum Thema "Dateisuche" gibt es einen Beitrag in der Code-Library das sollte als Lösungsansatz helfen!
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#4
  Alt 25. Apr 2003, 12:03
Dass das mit FindFirst und FindNext irgendwie geht konnte ich mir schon denken. Warum hab ich das in der Code-Library nicht gefunden?? egal! danke für die Lösungsansätze!
Geht ja echt schnell hier! Super Forum mit super Usern *Schleim*
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:50 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