Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   probleme verzeichnisse zu suchen (https://www.delphipraxis.net/110886-probleme-verzeichnisse-zu-suchen.html)

1ermehr 26. Mär 2008 10:24


probleme verzeichnisse zu suchen
 
Wiese kann ich mit der FindFirst, FindNext methode nur dateien suchen obwohl es extra einen parameter faDirectory in der FindFirst gibt?
Problemcode:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
fts: TSearchRec;
fcount, dcount: integer;
begin
 fcount := 0;
 dcount := 0;
 findfirst(DirectoryListBox1.Directory+'\*.*',faDirectory,fts);
 listbox1.Items.Add(fts.Name);
 if fts.Attr = faDirectory then inc(dcount,1)
                            else inc(fcount,1);
 repeat
 findnext(fts);
 listbox1.Items.Add(fts.Name);
 if fts.Attr = faDirectory then inc(dcount,1)
                            else inc(fcount,1);
 until findnext(fts) <> 0;

 FindClose(fts);
 label1.Caption := inttostr(fcount+dcount)+' items. ' + inttostr(fcount)+
                   ' files, ' + inttostr(dcount)+ ' directories.';
 end;
Ergebnis: 127 items. 127 files, 0 directories

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

angos 26. Mär 2008 10:29

Re: probleme verzeichnisse zu suchen
 
Hi und herzlich willkommen.

Also ich hab den Code mal übernommen, und der läuft Fehlerfrei (ok, mein verzeichnis hab ich in nem edit stehen, aber das dürfte ja egal sein...)

Verwende doch zukünfitg DElphi-Tags und formatiere den Code um den code überischtlicher darzustellen ;)

Hier einmal mein Code (es werden die "Verzeichnisse '.' und '..' mitgezählt!)

Delphi-Quellcode:
procedure TForm1.btnClick(Sender: TObject);
var
  fts: TSearchRec;
  fcount, dcount: integer;
begin
  fcount := 0;
  dcount := 0;
  findfirst(edt.Text + '\*.*', faDirectory, fts);
  listbox1.Items.Add(fts.Name);
  if fts.Attr = faDirectory then
    inc(dcount, 1)
  else
    inc(fcount, 1);
  repeat
    findnext(fts);
    listbox1.Items.Add(fts.Name);
    if fts.Attr = faDirectory then
      inc(dcount, 1)
    else
      inc(fcount, 1);
  until findnext(fts) <> 0;

  FindClose(fts);
  label1.Caption := inttostr(fcount + dcount) + ' items. ' + inttostr(fcount) +
    ' files, ' + inttostr(dcount) + ' directories.';
end;
EDIT: Das ist im wesentlichen dein Code, nur halt das der Name des Verzeichnisses aus dem edt gezogen wird... Wie gesagt, bei mir gibt der mir in dem Label exakt die Dateianzahl und Verzeichnisanzahl zurück.
Sicher, dass in dem angegebenen Verzeichnis unterverzichnisse liegen?

Gruß

1ermehr 2. Mai 2008 06:40

Re: probleme verzeichnisse zu suchen
 
Hab den code mal direkt kopiert und es passt immer noch nicht...
Es werden willkührlich verzeichnisse ausgelassen

mkinzler 2. Mai 2008 06:48

Re: probleme verzeichnisse zu suchen
 
Sind das besondere Verzeichnisse?

1ermehr 2. Mai 2008 06:52

Re: probleme verzeichnisse zu suchen
 
Kein wunder dass was ausgelassen wird wenn man alles doppelt macht, machmal
wünsche ich mir ich könnte lesen :stupid:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 fts: TSearchRec;
 fcount, dcount: integer;
begin
 fcount := 0;
 dcount := 0;

 findfirst(DirectoryListBox1.Directory+'\*.*',faDirectory,fts);
 listbox1.Items.Add(fts.Name);

 if fts.Attr = faDirectory then inc(dcount,1)
                           else inc(fcount,1);

 repeat
  findnext(fts); // <--- ganz böser fehler
  listbox1.Items.Add(fts.Name);

  if fts.Attr = faDirectory then inc(dcount,1)
                            else inc(fcount,1);
 until findnext(fts) <> 0;

 FindClose(fts);
 label1.Caption := inttostr(fcount+dcount)+' items. ' + inttostr(fcount)+ 
 ' files, ' + inttostr(dcount)+ ' directories.';
end;
Trotzdem dankeschön

DP-Maintenance 2. Mai 2008 17:14

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Kein allgemeines Programmierproblem

Der.Kaktus 2. Mai 2008 17:25

Re: probleme verzeichnisse zu suchen
 
hallo, schau mal hier in der :dp:--->Verzeichnisse

Christian Seehase 2. Mai 2008 17:31

Re: probleme verzeichnisse zu suchen
 
Moin 1ermehr,

auch wenn es jetzt so bei Dir wohl funktioniert, wie Du es Dir vorstellst, habe ich noch ein paar Anmerkungen ;-)

FindFirst ist eine Funktion, die mit ihrem Rückgabewert kenntlich macht, ob sie erfolgreich aufgerufen wurde.
Hier fehlt mir die Prüfung, und entsprechende Verzweigung.

Durch einen erfolgreichen Aufruf von FindFirst, wird eine Resource belegt, nämlich ein Handle durch TSearchRec.
Deshalb sollte sichergestellt werden, dass die Resource auch wieder freigegeben wird (try-finally => Resourcenschutzblock)

Delphi-Quellcode:
if FindFirst(...) <> 0 then exit;
try
//... mach was mit der Resource
finally
  FindClose(...);
end;
Da FindFirst intern FindFirstFile aufruft, und diese Funktion nur die Namesmaske zur Prüfung heranzieht, nicht aber die Attribute (das macht, teilweise FindFirst), fährt man, i.d.R. besser, wenn man immer faAnyFile angibt, und dann, nach Bedarf, selber filtert.

Diese Prüfung:

Delphi-Quellcode:
if fts.Attr = faDirectory then ...
setzt voraus, dass auch nur das Attribut für ein Directory gesetzt ist. Es kann aber auch versteckt sein, ausserdem verwendet Windows intern das ReadOnly-Flag für Verzeichnisse (wenn sich Windows dabei verhaspelt, kann man schon mal ein schreibgeschütztes Verzeichnis bekommen ;-))
Besser wäre es so abzufragen:

Delphi-Quellcode:
if (fts.Attr and faDirectory) = faDirectory then ...

1ermehr 14. Mai 2008 04:20

Re: probleme verzeichnisse zu suchen
 
Ich versthehe einfach nicht warum die rekursion hier nicht funktioniert sie müsste an der richtigen stelle
sein aber wird stumpf nicht ausgeführt...

Delphi-Quellcode:
procedure findf(path: string);
var
  fts: TSearchRec;
  fcount, dcount: integer;
  buf: string;
begin
  fcount := 0;
  dcount := 0;
  findfirst(path+'\*.*', faanyfile, fts);
  if fts.Attr = faDirectory then
    inc(dcount, 1)
  else
    inc(fcount, 1);
  repeat
    if (DirectoryExists(fts.Name) and not ((fts.Name = '.') or (fts.Name = '..'))) then
     begin
      buf := path+'\'+fts.Name;
      findf(buf); // dieser aufruf wird dreist ignoriert
      form1.ListBox1.Items.add(buf);
      Application.ProcessMessages;
      if FileExists(path+'\'+fts.Name + '\' + form1.edit1.text) then form1.listbox1.Items.Add(fts.Name);
      inc(dcount, 1)
     end
    else inc(fcount, 1);
  until findnext(fts) <> 0;

  FindClose(fts);
  form1.label1.Caption := inttostr(fcount + dcount) + ' items. ' + inttostr(fcount) +
    ' files, ' + inttostr(dcount) + ' directories.';
end;
Bitte helft mir mein kopf platzt bald...

1ermehr 14. Mai 2008 05:15

Re: probleme verzeichnisse zu suchen
 
Langsam wirds peinlich für mich... naja ist ja auch schon spät :drunken:

Delphi-Quellcode:
repeat
    if (DirectoryExists({path+'\'vergessen}fts.Name) and not ((fts.Name = '.') or (fts.Name = '..'))) then
     begin
Ich hab schon mal erwähnt das ich gerne lesen könnte oder?
Denn wenn ichs könnte würd ich hier nicht so fragen stellen
für die man einfach nur mal hinschauen muss


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Seite 1 von 2  1 2      

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