AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi FindFirst usw unterschlagen Verzeichnisse
Thema durchsuchen
Ansicht
Themen-Optionen

FindFirst usw unterschlagen Verzeichnisse

Ein Thema von Jörn · begonnen am 12. Jan 2004 · letzter Beitrag vom 12. Jan 2004
Antwort Antwort
Jörn

Registriert seit: 5. Sep 2003
Ort: Helmstedt
312 Beiträge
 
#1

FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 15:44
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*
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#2

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 15:50
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
Ulrich Strauer
  Mit Zitat antworten Zitat
s14

Registriert seit: 15. Mai 2003
Ort: München
251 Beiträge
 
Delphi 7 Architect
 
#3

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 15:58
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;
  Mit Zitat antworten Zitat
Jörn

Registriert seit: 5. Sep 2003
Ort: Helmstedt
312 Beiträge
 
#4

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 16:07
Hmm abgesehen davon, dass ich einmal

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*.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#5

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 16:17
  • 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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#6

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 16:22
Ausserdem kommt es vor, das
    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

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

PS: Das *.* habe ich eingefügt, da es auch Ordner mit Punkt drin gibt.
  Mit Zitat antworten Zitat
Jörn

Registriert seit: 5. Sep 2003
Ort: Helmstedt
312 Beiträge
 
#7

Re: FindFirst usw unterschlagen Verzeichnisse

  Alt 12. Jan 2004, 16:23
Arg bin ich doof jetzt beisse ich mir erst recht ins Knie *nag*
Vielen Dank himitsu und ihr anderen!
  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 08:17 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