![]() |
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:
Ergebnis: 127 items. 127 files, 0 directories
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; [edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit] |
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:
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.
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; Sicher, dass in dem angegebenen Verzeichnis unterverzichnisse liegen? Gruß |
Re: probleme verzeichnisse zu suchen
Hab den code mal direkt kopiert und es passt immer noch nicht...
Es werden willkührlich verzeichnisse ausgelassen |
Re: probleme verzeichnisse zu suchen
Sind das besondere Verzeichnisse?
|
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:
Trotzdem dankeschön
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; |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Kein allgemeines Programmierproblem |
Re: probleme verzeichnisse zu suchen
hallo, schau mal hier in der :dp:--->
![]() |
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:
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.
if FindFirst(...) <> 0 then exit;
try //... mach was mit der Resource finally FindClose(...); end; Diese Prüfung:
Delphi-Quellcode:
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 ;-))
if fts.Attr = faDirectory then ...
Besser wäre es so abzufragen:
Delphi-Quellcode:
if (fts.Attr and faDirectory) = faDirectory then ...
|
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:
Bitte helft mir mein kopf platzt bald...
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; |
Re: probleme verzeichnisse zu suchen
Langsam wirds peinlich für mich... naja ist ja auch schon spät :drunken:
Delphi-Quellcode:
Ich hab schon mal erwähnt das ich gerne lesen könnte oder?
repeat
if (DirectoryExists({path+'\'vergessen}fts.Name) and not ((fts.Name = '.') or (fts.Name = '..'))) then begin 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 15:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz