AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Probleme mit GetFilesInDirectory Procedure
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit GetFilesInDirectory Procedure

Ein Thema von Dash · begonnen am 10. Sep 2006 · letzter Beitrag vom 15. Feb 2025
Antwort Antwort
Seite 1 von 2  1 2      
Dash
(Gast)

n/a Beiträge
 
#1

Probleme mit GetFilesInDirectory Procedure

  Alt 10. Sep 2006, 02:28
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
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#2

Re: Probleme mit GetFilesInDirectory Procedure

  Alt 10. Sep 2006, 07:49
Ich glaube Dein False musst Du in True umbenennen, also so:
GetFilesInDirectory('C:\', '*.*', Listbox1.Items, True, True); Grüße Go2EITS
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.120 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Probleme mit GetFilesInDirectory Procedure

  Alt 10. Sep 2006, 11:08
Moin Dash,

diese Zeile

if (SR.Attr = faDirectory) and muss so

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

if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try auch wenn das in diesem Falle sogar funktionieren würde, sollte es besser

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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Dash
(Gast)

n/a Beiträge
 
#4

Re: Probleme mit GetFilesInDirectory Procedure

  Alt 10. Sep 2006, 20:47
Zitat von Go2EITS:
Ich glaube Dein False musst Du in True umbenennen, also so:
GetFilesInDirectory('C:\', '*.*', Listbox1.Items, True, True); Grüße Go2EITS
Stimmt, ich hatte es bei mir aber schon geändert

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

Gruß
Dash
  Mit Zitat antworten Zitat
Migo

Registriert seit: 25. Sep 2005
Ort: Nordfriesland
14 Beiträge
 
Delphi 12 Athens
 
#5

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 14. Feb 2025, 18:01
Das Thema ist zwar schon einige Jahre alt... aber ich nutze die Rekursive Suche mit GetFilesInDirectory immer noch gerne:
Code:
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 and not 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 and faDirectory) = 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;
Nun ist aber mein ungelöstes Problem, das ich bei der Suche in C:\ProgramData folgendes als Ergebnis bekomme, wenn ich nach "lights*" suche: Siehe angehängten Screenshot.

?!? Er dürfte mir die Dateien "Light Skin..." doch gar nicht anzeigen? Was mag der Grund sein?

Gruß,
Migo
Miniaturansicht angehängter Grafiken
screenshot-2025-02-14-175357.jpg  

Geändert von Migo (14. Feb 2025 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.277 Beiträge
 
Delphi 12 Athens
 
#6

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 14. Feb 2025, 18:53
Altes ANSI-Delphi? (D7 oder davor)
Und kein Kompatibilitätsmanifest vorhanden, bzw. läuft die Anwendung in einem Kompatibilitätsmodus? (WinXP oder so)


Hmmm, eigentlich sieht es nicht so aus,
aber würden die ShortNames verwendet, dann wäre es eine Erklärung.

Ohh ja, es werden ShortName und LongName vom FindFirst/FindNext berücksichtigt.

Verwende deinen Debugger und schau, was im SR alles drin steht, bzw. genauer in SR.FindData.cAlternateFileName




Ist Directory leer '' , dann raucht es dir ab
Delphi-Quellcode:
if Directory[Length(Directory)] <> '\then
      Directory := Directory + '\';
und, selbst wenn nicht, dann sollte if Directory = '\then Exit; bestimmt erst danach erfolgen.

Delphi-Referenz durchsuchenEndsStr, bzw. IncludeTrailingBackslash Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter

Delphi-Referenz durchsuchenTDirectory.GetFiles
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Feb 2025 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Migo

Registriert seit: 25. Sep 2005
Ort: Nordfriesland
14 Beiträge
 
Delphi 12 Athens
 
#7

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 15. Feb 2025, 10:26
Ohh ja, es werden ShortName und LongName vom FindFirst/FindNext berücksichtigt.
Danke Dir für Dein Feedback.
Ja, es werden beide wohl berücksichtigt - leider fehlt mir aktuell das Wissen, meine Prozedur so umzubauen, dass nur LongNames berücksichtigt werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.277 Beiträge
 
Delphi 12 Athens
 
#8

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 15. Feb 2025, 10:59
Den Namen nochmals mit Delphi-Referenz durchsuchenMatchesMask (System.Masks) prüfen.

Ob jetzt FindFirst oder via Delphi-Referenz durchsuchenTDirectrory.GetFiles, ist dabei auch egal.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.543 Beiträge
 
Delphi 7 Professional
 
#9

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 15. Feb 2025, 11:05
TSearchRec hat auch noch das Feld FindData. Da gibt es dann SearchRec.FindData.cFileName für den langen Dateinamen und SearchRec.FindData.cAlternateFileName für den kurzen Dateinamen.

Wenn Du nun nach lights* suchst, prüfst Du in cFileName, ob's auch mit lights beginnt. Light Skin fiele dann raus.

Wenn Du willst kannst Du die Prüfung dann auch noch casesensitiv machen, damit sich lights und Lights auch noch unterscheiden lassen.

Ansonsten: Reguläre Ausdrücke oder MatchesMask (wie schon vorgeschlagen).
  Mit Zitat antworten Zitat
Migo

Registriert seit: 25. Sep 2005
Ort: Nordfriesland
14 Beiträge
 
Delphi 12 Athens
 
#10

AW: Probleme mit GetFilesInDirectory Procedure

  Alt 15. Feb 2025, 14:51
Ansonsten: Reguläre Ausdrücke oder MatchesMask (wie schon vorgeschlagen).
Ganz lieben Dank Euch beiden! Ihr habt mir sehr geholfen mit Eurer Hilfestellung.

Ich konnte mir mit
Code:
if MatchesMask(SR.Name, Suchmaske) then
nun weiterhelfen und bekomme jetzt die richtigen Ergebnisse angezeigt.


Interessanterweise konnte mir die Abfrage mit
Code:
if MatchesMask(SR.FindData.cFileName, Suchmaske) then
da nicht weiterhelfen. Sie zeigte nicht das gewünschte Ergebnis an.



Geändert von Migo (15. Feb 2025 um 14:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 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 by Thomas Breitkreuz