![]() |
Rekursive Dateisuche lässt Unterverzeichnisse aus
Hallo Zusammen,
mit diesem Code, den ich übernommen, nachvollzogen und angepasst habe, möchte ich alle Dateien, in denen ein Teilstring ("4711") vorkommt, in einem StringGrid mit dem jeweiligen Pfad ausgeben. Dabei sollen alle Unterverzeichnisse mit überprüft und die Dateien und Pfade ebenfalls ausgegeben werden.
Delphi-Quellcode:
Ich habe verschiedene Möglichkeiten versucht, aber es wird immer nur im Hauptverzeichnis gesucht und nicht in darin enthaltenen Unterverzeichnissen. Kann mir jemand weiterhelfen?
function FileSearches(const PathName, FileName : string; const InDir : boolean): TRows; // InDir gibt an ob Unterverzeichnisse mit durchsucht werden sollen
var Rec : TSearchRec; Path : string; begin setlength(Result,2,0); Path := IncludeTrailingBackslash(PathName); if FindFirst(Path + '*'+FileName+'*', faAnyFile and not faDirectory, Rec) = 0 then try repeat SetLength(Result,2,Length(Result[0])+1); Result[0,Length(Result[0])-1]:=Path; Result[1,Length(Result[0])-1]:=Rec.Name; until FindNext(Rec) <> 0; finally FindClose(Rec); end; If not InDir then Exit; if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then try repeat if (Rec.Attr in [faDirectory]) and (Rec.Name<>'.') and (Rec.Name<>'..') then //An dieser Stelle werden die Bedingungen nicht erfüllt, obwohl Unterverzeichnisse und weitere Treffer vorhanden sind FileSearches(Path + Rec.Name, FileName, True); until FindNext(Rec) <> 0; finally FindClose(Rec); end; end; Vielen Dank Patrick |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
Delphi-Quellcode:
if (Rec.Attr and faDirectory = faDirectory)
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
Delphi-Quellcode:
sollte auch gehen :)
if ( faDirectory in Rec.Attr )
Was sagt die Doku zu ![]() |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Japp, nur so wie ursprünglich klappt es eben nicht, wenn das Verzeichnis noch weitere Attribute hat.
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Warum so kompliziert?
Delphi-Quellcode:
uses System.IOUtils;
procedure listFiles(); const searchPattern: String = '*4711*'; var fileName: String; begin for fileName in TDirectory.GetFiles('x:\', searchPattern, TSearchOption.soAllDirectories) do WriteLn(fileName); end; |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Hallo,
erst mal vielen Dank für die schnellen Antworten!!!
Delphi-Quellcode:
Ich habe es ausprobiert, aber leider kein Erfolg.
if (Rec.Attr and faDirectory = faDirectory)
faDirector=16 Rec.Attr=48 Ich weiß beide Werte leider nicht zu interpretieren.
Delphi-Quellcode:
hier kommt die Fehlermeldung
if ( faDirectory in Rec.Attr )
Delphi-Quellcode:
Gruß Patrick
E2015 Operator ist auf diesen Operandentyp nicht anwendbar
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Würde aber passen.
Code:
00110000 //Rec.Attr
00010000 //faDirectory ======== 00010000 //faDirectory |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Das Problem sind die fehlenden Klammern ;)
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
@Sir Rufo
Jepp, die Fehlermeldung ist weg, aber ich das Ergebnis ist das gleiche - es wird nur die Datei in dem Hauptverzeichnis angezeigt... Ich weiß nicht ob es wichtig ist, aber der Pfad sieht so aus: \\172.30.44.120\Zeichnungen\ Und dann gibt es halt Unterverzeichnisse \\172.30.44.120\Zeichnungen\A\ \\172.30.44.120\Zeichnungen\Neu\ Ich versuche gerade den Gedanken vom schönen Günter umzusetzen... Vielen Dank Patrick |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Ähm meine Aussage bezog sich auf den Code-Schnipsel von DeddyH. Meinen Code-Schnipsel habe ich in meinem Beitrag schon für ungültig erklärt.
Zitat:
Delphi-Quellcode:
if ( ( Rec.Attr and faDirectory ) = faDirectory)
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Was sollen zusätzliche Klammern denn bewirken (außer, dass der Programmierer es evtl. etwas besser versteht)?
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Bei mir funktioniert dieser Code schon seit vielen Jahren in zahlreichen Anwendungen absolut zuverlässig:
Delphi-Quellcode:
In ADirectory wird das zu durchsuchende Verzeichnis angegeben.
procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList, DatList, GrossList: TStrings; ARekursiv: Boolean);
var SR : TSearchRec; Datum : TDateTime; begin ADirectory := BackShlashAmEnde(ADirectory); if (SysUtils.FindFirst(ADirectory + AMask,faAnyFile and not faDirectory,SR) = 0) then begin repeat if (SR.Name<>'.') AND (SR.Name<>'..') AND (SR.Attr<>faDirectory) then begin AList.Add(ADirectory+SR.Name); Datum := FileDateToDateTime(Sr.Time); DatList.Add(DateToStr(Datum)); GrossList.Add(IntToStr(Sr.size)); end; until SysUtils.FindNext(SR)<>0; SysUtils.FindClose(SR); end; if ARekursiv then if (SysUtils.FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then begin repeat if (SR.Name<>'.') AND (SR.Name<>'..') then GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,DatList,GrossList,True); until FindNext(SR)<>0; SysUtils.FindClose(SR); end; end; AMask enthält die Suchmaske. AList liefert die Dateiliste zurück. DatList liefert die zugehörigen Datei-Datumwerte zurück. GrossList liefert die zugehörigen Datei-Größen zurück. ARekursiv gibt an, ob Unterverzeichnisse durchsucht werden sollen. |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Kann ich mir nicht vorstellen, denn
Zitat:
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Ist schon jemandem aufgefallen, dass
Delphi-Quellcode:
eine
FileSearches
Delphi-Quellcode:
mit dem Rückgabetyp
function
Delphi-Quellcode:
ist, dessen Ergebnis für die Unterverzeichnisse weder zugewiesen noch ausgewertet wird? Das dürfte das Problem erklären. Oder verstehe ich die Rekursion falsch?
TRows
MfG Dalai |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Nö, aber ich dachte, dass er mittels Debugger die gekennzeichnete Zeile als fehlerhaft ausgemacht hat. Das hat mit dem Funktionsergebnis erstmal nichts zu tun, obwohl das natürlich auch vom Compiler bemängelt werden sollte.
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Hallo Zusammen,
vielen Dank für die zahlreiche Unterstützung!!! So klappt es jetzt:
Delphi-Quellcode:
Ich hätte erwähnen sollen, dass TRows ein Array of Array of string ist.
function listFiles(Pfad, FileName: string): TRows;
var I: integer; begin filename:='*'+fileName+'*'; setlength(Result,1,0); for fileName in TDirectory.GetFiles(Pfad, FileName, TSearchOption.soAllDirectories) do begin SetLength(Result,2,Length(Result[0])+1); Result[0,Length(Result[0])-1]:=FileName; end; end; @Sir Rufo Ich hatte die eckigen Klammern vergessen, wodurch die Fehlermeldung ausgelöst wurde. Vielen Dank nochmal Patrick |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
Wenn hier
Delphi-Quellcode:
:
if (Rec.Attr and faDirectory = faDirectory)
AND wir immer vor = aufgelöst, also passt es. Da aber alle Dateiattribute nur aus einem Bit bestehen, kann man das noch kürzen
Delphi-Quellcode:
if (Rec.Attr and faDirectory <> 0)
Das mit dem IN klappt nicht, da Attr ein Integer und kein Set ist, außerdem sind die fa-Konstanten Bit-Masken und keine Indize. (gut, man könnte den Integer in ein
Delphi-Quellcode:
, aber dann ist noch das Problem mit den Konstanten, also wenn dann lieber direkt in ein TAttributeSet casten und als Property in TSearchRec rein)
set of 0..31
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
Delphi-Quellcode:
wird gar nicht kompiliert, dazu müsste man schon explizit Rec.Attr nach Boolean casten, dann ist man aber auch selbst Schuld, wenn es nicht stimmt.
if (Rec.Attr and (faDirectory = faDirectory))
Zitat:
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
@himitsu
Ja, Ja ... :) @DeddyH Der Code von Perusau funktioniert, denn der Such-Filter steht auf
Delphi-Quellcode:
.
faAnyFile and not faDirectory
Allerdings könnte das hier
Delphi-Quellcode:
direkt wieder raus, der dürfte nie anschlagen ;)
if (SR.Name<>'.') AND (SR.Name<>'..') AND (SR.Attr<>faDirectory) then
|
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
Ich habe SetLength(..) noch nie mit zwei Parametern gesehen. Ich habe auch, glaube ich, noch nie mehrdimensionale Arrays benutzt. Deshalb kann es auch sein, dass ich die Intention dahinter nicht verstehe. PS: So würde ich es schreiben
Delphi-Quellcode:
uses
System.SysUtils, System.IOUtils, System.Types; type TRows = array of array of string; function listFiles( const Pfad: String; FileName: string ): TRows; var fileNames: TStringDynArray; fileNameIndex: Integer; begin filename := '*' + fileName + '*'; fileNames := TDirectory.GetFiles(Pfad, FileName, TSearchOption.soAllDirectories); SetLength(Result, 2); SetLength( Result[0], Length(fileNames) ); SetLength( Result[1], Length(fileNames) ); for fileNameIndex := Low(fileNames) to High(fileNames) do Result[0, fileNameIndex] := fileNames[fileNameIndex]; end; |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
@Sir Rufo: ich hab mich nur an Threads wie
![]() |
AW: Rekursive Dateisuche lässt Unterverzeichnisse aus
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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-2025 by Thomas Breitkreuz