![]() |
[gelöst] TFindFile-Komponente - Nur Verzeichnisse listen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich habe auf einer Delphi-Seite folgenden Komponentenquellcode gefunden, der mir alle Dateien/Verzeichnisse ( auch nach Attributen gefiltert ) ausgibt. So weit ist alles klar. Ich habe in meinen Programmen ähnliche Routinen (Dateien ODER Ordner listen) schon x-mal erfolgreich benutzt, daher ist mir der Code auch vollkommen verständlich. Nur eines begrife ich nicht: Wenn ich alls Attribut NUR "ffaDirectory" auf true setze, dann listet die Komponente mir eben nicht nur Verzeichnisse auf - warum auch immer. Hatte bei mir dasselbe Problem. Ich habe es so gelöst, daß in diesem Falle eine extra "Ordner-Listen-Funktion" aufgerufen wurde, in der alle Dateien herausgelöscht wurden, wenn dieses Flag gesetzt wurde. Ich hoffe das Problem ist verständlich beschrieben. Gibt es dafür eine einfache Lösung ( wenn nur ffaDirectory = true dann auch wirklich nur Verzeichnisse listen ) oder liegt es an den Attributen an sich? Hier mal ein Ausschnitt der Unit:
Delphi-Quellcode:
//EDIT: Anbei der Quelltext der Komponente
unit FindFile;
[...] type TFileAttrKind = (ffaReadOnly, ffaHidden, ffaSysFile, ffaVolumeID, ffaDirectory, ffaArchive, ffaAnyFile); TFileAttr = set of TFileAttrKind; [...] procedure TFindFile.FileSearch(const InPath : string); var Rec : TSearchRec; Attr : integer; begin Attr := 0; if ffaReadOnly in FileAttr then Attr := Attr + faReadOnly; if ffaHidden in FileAttr then Attr := Attr + faHidden; if ffaSysFile in FileAttr then Attr := Attr + faSysFile; if ffaVolumeID in FileAttr then Attr := Attr + faVolumeID; if ffaDirectory in FileAttr then Attr := Attr + faDirectory; if ffaArchive in FileAttr then Attr := Attr + faArchive; if ffaAnyFile in FileAttr then Attr := Attr + faAnyFile; if SysUtils.FindFirst(inPath + FileMask, Attr, Rec) = 0 then try repeat s.Add(inPath + Rec.Name); until SysUtils.FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; If not InSubFolders then Exit; if SysUtils.FindFirst(inPath + '*.*', faDirectory, Rec) = 0 then try repeat if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then begin FileSearch(IncludeTrailingBackslash(inPath + Rec.Name)); end; until SysUtils.FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end; end. { ******************************************** Zarko Gajic About.com Guide to Delphi Programming [url]http://delphi.about.com[/url] email: [email]delphi.guide@about.com[/email] free newsletter: [url]http://delphi.about.com/library/blnewsletter.htm[/url] forum: [url]http://forums.about.com/ab-delphi/start/[/url] ******************************************** } |
Re: TFindFile-Komponente - Nur Verzeichnisse listen?
Zitat:
|
Re: TFindFile-Komponente - Nur Verzeichnisse listen?
Zitat:
|
Re: [gelöst] TFindFile-Komponente - Nur Verzeichnisse listen
Moin Michael,
die Unit, die Du da hast, enthält eine böse Macke: Flags sollte man niemals mit + verknüpfen, sondern mit OR. Wenn man sich die Zahlenwerte dahinter schreibt, und mal nachrechnet, wird auch klar warum:
Delphi-Quellcode:
Werden alle Werte angegeben, so ergibt sich beim aufsummieren der Wert $7E, werden die Werte verknüpft, so ist es $3F.
Attr := 0;
if ffaReadOnly in FileAttr then Attr := Attr + faReadOnly; // Wert: $00000001 if ffaHidden in FileAttr then Attr := Attr + faHidden; // Wert: $00000002 if ffaSysFile in FileAttr then Attr := Attr + faSysFile; // Wert: $00000004 if ffaVolumeID in FileAttr then Attr := Attr + faVolumeID; // Wert: $00000008 if ffaDirectory in FileAttr then Attr := Attr + faDirectory; // Wert: $00000010 if ffaArchive in FileAttr then Attr := Attr + faArchive; // Wert: $00000020 if ffaAnyFile in FileAttr then Attr := Attr + faAnyFile; // Wert: $0000003F faAnyFile entspricht nämlich schon der Oder-Verknüpfung aller übrigen Werte. Legt man diesen Wert noch einmal mit OR-Verküpft drauf, passiert nichts weiter, bei + erhält man einen ungültigen Wert. (Ich weiss, in der Delphi-Hilfe steht es auch so, aber dadurch wird es nicht richtiger ;-)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 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