Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FindFirst usw unterschlagen Verzeichnisse (https://www.delphipraxis.net/14608-findfirst-usw-unterschlagen-verzeichnisse.html)

Jörn 12. Jan 2004 14:44


FindFirst usw unterschlagen Verzeichnisse
 
Ich will ein Prog schreiben das mir alle Verzeichnisse mitsamt Unterverzeichnissen auflistet. Dafür habe ich erst mal getestet, sprich ein Programm geschrieben, das die Verzeichnisse erst mal ohne Unterverzeichnisse auflistet... doch mein Testprog unterschlägt Verzeichnisse! Ich rätsel da schon rum wie ein Blöder!

Habe ein Editfeld mit Namen root (Verzeichnis in welchem gesucht wird) und ein Memofeld namens listenmemo...

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var verzeichnisse: TSearchRec;
begin
if findfirst(root.Text + '*', fadirectory, verzeichnisse) = 0 then
  begin
    listenmemo.Lines.add(verzeichnisse.name);
    repeat
    findnext(verzeichnisse);
    if verzeichnisse.Attr = 16 then
    listenmemo.Lines.add(verzeichnisse.name);
    until findnext(verzeichnisse) <> 0;
  end;
findclose(verzeichnisse);
end;
Vielen Dank schon mal für die Hilfe!
Ich beiss mir bald noch ins Knie wegen so was *gg*

ustra 12. Jan 2004 14:50

Re: FindFirst usw unterschlagen Verzeichnisse
 
Hi,

Du rufst findnext einmal zu viel auf. So ist die Schleife richtig:
Code:
    repeat
    findnext(verzeichnisse);
    if verzeichnisse.Attr = 16 then
    listenmemo.Lines.add(verzeichnisse.name);
    until findnext(verzeichnisse) <> 0;
Gruss Ulrich

s14 12. Jan 2004 14:58

Re: FindFirst usw unterschlagen Verzeichnisse
 
Es sollte auch das aktuelle und übergeordnete Verzeichnis übergangen werden:

Delphi-Quellcode:
  if FindFirst(verz + '*.*',fadirectory, Search)= 0 then begin
  repeat
    if((search.attr and fadirectory)=fadirectory) and (search.name<>'.') and (search.name<>'..') then begin
      // Rekursion
      GetFolderCount(verz+ Search.Name + '\' + such);
    end;
  until FindNext(Search) <> 0;

Jörn 12. Jan 2004 15:07

Re: FindFirst usw unterschlagen Verzeichnisse
 
Hmm abgesehen davon, dass ich einmal

Delphi-Quellcode:
if suche.Attr = 16 then
vergessen habe (vor dem ersten hinzufügen zum memo), sehe ich da keinen Unterschied zu deiner Variante, ustra. s14, dein Ratschlag ist natürlich sinnvoll, hat mich eben allerdings nicht interessiert *gg*.

himitsu 12. Jan 2004 15:17

Re: FindFirst usw unterschlagen Verzeichnisse
 
  • findnext(verzeichnisse); ist zuviel, dadurch wird das 2. Verzeichnis übersprungen.
  • verzeichnisse.Attr = 16 hierdurch wird jedes Verzeichnis übersprungen, das ausser dem Verzeichnisattribut noch andere hat. (z.B. das Archiv-, Systemattribut... - daher "(verzeichnisse.Attr and faDirectory) <> 0" oder "(verzeichnisse.Attr and faDirectory) = faDirectory")
  • (verzeichnisse.Name <> '.') and (verzeichnisse.Name <> '..' überspringt 2 Verzeichnisse, die keine Unterverzeichnisse sind.
Code:
procedure TForm1.ButtonClick(Sender: TObject);
var verzeichnisse: TSearchRec;
begin
if findfirst(root.Text + '*', fadirectory, verzeichnisse) = 0 then
  begin
    listenmemo.Lines.add(verzeichnisse.name);
    repeat
    [color=red]findnext(verzeichnisse);[/color]
    if [color=red]verzeichnisse.Attr = 16[/color] then
    listenmemo.Lines.add(verzeichnisse.name);
    until findnext(verzeichnisse) <> 0;
  end;
findclose(verzeichnisse);
end;
Delphi-Quellcode:
Procedure TForm1.ButtonClick(Sender: TObject);
  Var verzeichnisse: TSearchRec;

  Begin
    If FindFirst(root.Text + '*', fadirectory, Verzeichnisse) = 0 Then Begin
      Repeat
        If ((verzeichnisse.Attr and faDirectory) <> 0) and
          (verzeichnisse.Name <> '.') and (verzeichnisse.Name <> '..') Then
          listenmemo.Lines.Add(verzeichnisse.name);
      Until FindNext(verzeichnisse) <> 0;
    FindClose(verzeichnisse);
  End;

scp 12. Jan 2004 15:22

Re: FindFirst usw unterschlagen Verzeichnisse
 
Ausserdem kommt es vor, das
Delphi-Quellcode:
    If FindFirst(root.Text + '*', faDirectory, Verzeichnisse) = 0 Then Begin
Verzeichnisse nicht findet. Da das Attribut faDirectory z.B. in himitsus Code eh später überprüft wird, sollte man mit

Delphi-Quellcode:
    If FindFirst(root.Text + '*.*', faAnyFile, Verzeichnisse) = 0 Then Begin
arbeiten.

PS: Das *.* habe ich eingefügt, da es auch Ordner mit Punkt drin gibt.

Jörn 12. Jan 2004 15:23

Re: FindFirst usw unterschlagen Verzeichnisse
 
Arg bin ich doof jetzt beisse ich mir erst recht ins Knie *nag*
Vielen Dank himitsu und ihr anderen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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