Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [gelöst] TFindFile-Komponente - Nur Verzeichnisse listen? (https://www.delphipraxis.net/105896-%5Bgeloest%5D-tfindfile-komponente-nur-verzeichnisse-listen.html)

scrat1979 1. Jan 2008 20:42


[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:
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]
********************************************
}
//EDIT: Anbei der Quelltext der Komponente

sirius 1. Jan 2008 20:55

Re: TFindFile-Komponente - Nur Verzeichnisse listen?
 
Zitat:

Zitat von Delphi-Hilfe
Der Parameter Attr gibt an, welche speziellen Dateien zusätzlich zu den normalen Dateien angezeigt werden. Die folgenden Konstanten können verwendet werden:


scrat1979 1. Jan 2008 21:14

Re: TFindFile-Komponente - Nur Verzeichnisse listen?
 
Zitat:

Zitat von sirius
Zitat:

Zitat von Delphi-Hilfe
Der Parameter Attr gibt an, welche speziellen Dateien zusätzlich zu den normalen Dateien angezeigt werden. Die folgenden Konstanten können verwendet werden:


Vielen Dank für die Antwort. Dann wäre wohl alles gesagt, bis auf die Tatsache, daß meine Delphi-Hilfe ( Turbo Delphi Pro am Laptop ) eben diesen Satz nicht enthält - oder ich bin total blind :wall: :wall: :wall:

Christian Seehase 1. Jan 2008 21:42

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:
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
Werden alle Werte angegeben, so ergibt sich beim aufsummieren der Wert $7E, werden die Werte verknüpft, so ist es $3F.
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 00:31 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