Einzelnen Beitrag anzeigen

Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

[gelöst] TFindFile-Komponente - Nur Verzeichnisse listen?

  Alt 1. Jan 2008, 20:42
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
Angehängte Dateien
Dateityp: zip tfindfile_206.zip (1,3 KB, 6x aufgerufen)
Michael Kübler
  Mit Zitat antworten Zitat