AGB  ·  Datenschutz  ·  Impressum  







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

Ordner auf Festplatte suchen

Ein Thema von St.Pauli · begonnen am 24. Jan 2005 · letzter Beitrag vom 27. Jan 2005
Antwort Antwort
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#1

Ordner auf Festplatte suchen

  Alt 24. Jan 2005, 17:05
Hi,

kennt vieleicht jemand von euch ne Funktion wie ich alle Ordner auf einer Festplatte finden kann, die zum Beispiel ein 'abc' in ihrem Namen haben??
Also das mir das Prog am Ende anzeigt:

C:\abc\
C:\Windows\bbbabcddd\
C:\Programme\skjsjdkjabcllspl\

Gruß, St.Pauli
Gruß St.Pauli
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Ordner auf Festplatte suchen

  Alt 24. Jan 2005, 17:36
Hmm...

Gute Frage - Geht das nicht irgendwie mit FindFirst oder sowas?! Das hab ich auf die Schnelle gefunden. Musst mal schauen ob das nicht geht?!

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).

Code:
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:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetFilesInDirectory('C:\','*.*',Listbox1.Items,False);
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:

Code:
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:

Code:
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.
mfg shark
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Ordner auf Festplatte suchen

  Alt 25. Jan 2005, 15:28
Moin St. Pauli,

da wirst Du wohl alles durchsuchen, und selber filtern müssen.
Mit FindFirst und einer entsprechenden Maske wirst Du ansonsten keine Verzeichnisse finden können, sich in Verzeichnissen befinden, die nicht der Maske entsprechen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#4

Re: Ordner auf Festplatte suchen

  Alt 25. Jan 2005, 15:50
So, hab ma ein bisschen dran rumgetüftelt. Sollte jetzt eigentlich so klappen:

Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; const Mask: String;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
begin
  if FindFirst(Directory + Mask, faDirectory, SR) = 0 then try
    repeat
      List.Add(Directory + SR.Name)
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*', faDirectory, SR) = 0 then try
      repeat
        if (SR.Attr = 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;
Nur kennt jemand von euch ne Funk. die auch versteckte ordner findet, oder was muss ich umstellen, damit sie versteckte Ordner findet?

Gruß, St.Pauli
Gruß St.Pauli
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Ordner auf Festplatte suchen

  Alt 25. Jan 2005, 16:22
Um die versteckten ordner und Dateien zu finden, musst du noch das Attribut faHidden hinzufügen. Damit müsste es dann gehen.

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#6

Re: Ordner auf Festplatte suchen

  Alt 26. Jan 2005, 16:12
Hä? Ich dachte für Ordner gibt es nur faDirectory!
Gruß St.Pauli
  Mit Zitat antworten Zitat
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#7

Re: Ordner auf Festplatte suchen

  Alt 26. Jan 2005, 16:14
OK, sorry für den eintrag! gerade hab ich faDirectory + faHidden getestet und es läuft! Danke für die Hilfen!!!!

MfG, St.Pauli

__________________________________________________ __________________________________________
Gruß St.Pauli
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Ordner auf Festplatte suchen

  Alt 27. Jan 2005, 15:30
Moin St. Pauli,

wenn, dann mit or verknüpfen, nicht mit +, also faDirectory or faHidden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 07:33 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