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