![]() |
Probleme mit GetFilesInDirectory Procedure
Hi,
ich habe mir folgenden Code aus dem Delphi Forum kopiert:
Delphi-Quellcode:
Allerdings habe ich jetzt das Problem, dass er z.B. einfach C:\Programme auslässt wenn ich als Ordner C:\ angebe. Aber auch eine Menge anderer Ordner wie Temp Ordner werden einfach ausgelassen... kann mir jemand sagen was hier schief läuft?
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, faAnyFile - 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 + '*.*', faAnyFile, 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; procedure TForm1.Button1Click(Sender: TObject); begin GetFilesInDirectory('C:\', '*.*', Listbox1.Items, False, True); end; procedure TForm1.Button1Click(Sender: Tobject); var F: TSearchRec; begin if FindFirst(ed_dateiname.text, faAnyFile, F) = 0 then try Label1.Caption := F.Name Label2.Caption := IntToStr(F.Size); finally FindClose(F); end; end; Gruß Dash |
Re: Probleme mit GetFilesInDirectory Procedure
Ich glaube Dein False musst Du in True umbenennen, also so:
Delphi-Quellcode:
Grüße Go2EITS
GetFilesInDirectory('C:\', '*.*', Listbox1.Items, True, True);
|
Re: Probleme mit GetFilesInDirectory Procedure
Moin Dash,
diese Zeile
Delphi-Quellcode:
muss so
if (SR.Attr = faDirectory) and
Delphi-Quellcode:
aussehen.
if ((SR.Attr and faDirectory) <> 0) and
Auch ein Directory kann mehr als ein Attribut haben, und wenn das der Fall ist, klappt der Vergleich mit = nicht mehr, um ein Verzeichnis zu erkennen. [EDIT] Ausserdem sollte man Bitmasken, niemals mit + und - bearbeiten
Delphi-Quellcode:
auch wenn das in diesem Falle sogar funktionieren würde, sollte es besser
if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try
Delphi-Quellcode:
heissen. Hier hat übrigens das Beispiel zu FindFirst in der Delphi-Hilfe auch einen Fehler, da hier die Attribute mit + verknüpft werden (richtig wäre OR).
if FindFirst(Directory + Mask, faAnyFile AND NOT faDirectory, SR) = 0 then try
![]() Da FindFirst sich so gut wie nicht um den übergebenen Attributwert kümmert, wäre es sicherer es so zu schreiben:
Delphi-Quellcode:
[/EDIT]
if FindFirst(Directory + Mask, faAnyFile, SR) = 0 then try
repeat if (sr.Attr and faDirectory) = 0 then List.Add(Directory + SR.Name) until FindNext(SR) <> 0; |
Re: Probleme mit GetFilesInDirectory Procedure
Zitat:
@Christian Ich habe nun deinen letzten Code benutzt, allerdings hört er nach der ersten Datei auf zu scannen :? Gruß Dash |
AW: Probleme mit GetFilesInDirectory Procedure
Liste der Anhänge anzeigen (Anzahl: 1)
Das Thema ist zwar schon einige Jahre alt... aber ich nutze die Rekursive Suche mit GetFilesInDirectory immer noch gerne:
Code:
Nun ist aber mein ungelöstes Problem, das ich bei der Suche in C:\ProgramData folgendes als Ergebnis bekomme, wenn ich nach "lights*" suche: Siehe angehängten Screenshot.
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, faAnyFile and not 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 + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = 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; ?!? Er dürfte mir die Dateien "Light Skin..." doch gar nicht anzeigen? Was mag der Grund sein? Gruß, Migo |
AW: Probleme mit GetFilesInDirectory Procedure
Altes ANSI-Delphi? (D7 oder davor)
Und kein Kompatibilitätsmanifest vorhanden, bzw. läuft die Anwendung in einem Kompatibilitätsmodus? (WinXP oder so) Hmmm, eigentlich sieht es nicht so aus, aber würden die ShortNames verwendet, dann wäre es eine Erklärung. :gruebel: Ohh ja, es werden ShortName und LongName vom FindFirst/FindNext berücksichtigt. Verwende deinen Debugger und schau, was im SR alles drin steht, bzw. genauer in SR.FindData.cAlternateFileName :angle: Ist Directory leer
Delphi-Quellcode:
, dann raucht es dir ab
''
Delphi-Quellcode:
und, selbst wenn nicht, dann sollte
if Directory[Length(Directory)] <> '\' then
Directory := Directory + '\';
Delphi-Quellcode:
bestimmt erst danach erfolgen.
if Directory = '\' then Exit;
![]() ![]() ![]() |
AW: Probleme mit GetFilesInDirectory Procedure
Zitat:
Ja, es werden beide wohl berücksichtigt - leider fehlt mir aktuell das Wissen, meine Prozedur so umzubauen, dass nur LongNames berücksichtigt werden. :cry: |
AW: Probleme mit GetFilesInDirectory Procedure
Den Namen nochmals mit
![]() Ob jetzt FindFirst oder via ![]() |
AW: Probleme mit GetFilesInDirectory Procedure
TSearchRec hat auch noch das Feld FindData. Da gibt es dann SearchRec.FindData.cFileName für den langen Dateinamen und SearchRec.FindData.cAlternateFileName für den kurzen Dateinamen.
Wenn Du nun nach lights* suchst, prüfst Du in cFileName, ob's auch mit lights beginnt. Light Skin fiele dann raus. Wenn Du willst kannst Du die Prüfung dann auch noch casesensitiv machen, damit sich lights und Lights auch noch unterscheiden lassen. Ansonsten: Reguläre Ausdrücke oder MatchesMask (wie schon vorgeschlagen). |
AW: Probleme mit GetFilesInDirectory Procedure
Zitat:
Ich konnte mir mit
Code:
nun weiterhelfen und bekomme jetzt die richtigen Ergebnisse angezeigt.
if MatchesMask(SR.Name, Suchmaske) then
Interessanterweise konnte mir die Abfrage mit
Code:
da nicht weiterhelfen. Sie zeigte nicht das gewünschte Ergebnis an.
if MatchesMask(SR.FindData.cFileName, Suchmaske) then
:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 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