Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit GetFilesInDirectory Procedure (https://www.delphipraxis.net/76797-probleme-mit-getfilesindirectory-procedure.html)

Dash 10. Sep 2006 01:28


Probleme mit GetFilesInDirectory Procedure
 
Hi,

ich habe mir folgenden Code aus dem Delphi Forum kopiert:

Delphi-Quellcode:
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;
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?

Gruß
Dash

Go2EITS 10. Sep 2006 06:49

Re: Probleme mit GetFilesInDirectory Procedure
 
Ich glaube Dein False musst Du in True umbenennen, also so:
Delphi-Quellcode:
GetFilesInDirectory('C:\', '*.*', Listbox1.Items, True, True);
Grüße Go2EITS

Christian Seehase 10. Sep 2006 10:08

Re: Probleme mit GetFilesInDirectory Procedure
 
Moin Dash,

diese Zeile

Delphi-Quellcode:
if (SR.Attr = faDirectory) and
muss so

Delphi-Quellcode:
if ((SR.Attr and faDirectory) <> 0) and
aussehen.
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:
if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try
auch wenn das in diesem Falle sogar funktionieren würde, sollte es besser

Delphi-Quellcode:
if FindFirst(Directory + Mask, faAnyFile AND NOT faDirectory, SR) = 0 then try
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).
Hier hatte ich das schon einmal ausführlich erklärt.


Da FindFirst sich so gut wie nicht um den übergebenen Attributwert kümmert, wäre es sicherer es so zu schreiben:

Delphi-Quellcode:
  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;
[/EDIT]

Dash 10. Sep 2006 19:47

Re: Probleme mit GetFilesInDirectory Procedure
 
Zitat:

Zitat von Go2EITS
Ich glaube Dein False musst Du in True umbenennen, also so:
Delphi-Quellcode:
GetFilesInDirectory('C:\', '*.*', Listbox1.Items, True, True);
Grüße Go2EITS

Stimmt, ich hatte es bei mir aber schon geändert :wink:

@Christian
Ich habe nun deinen letzten Code benutzt, allerdings hört er nach der ersten Datei auf zu scannen :?

Gruß
Dash


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 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