![]() |
Dateien rekursiv suchen und in Typisirtes Array schreiben.
Hi @ll
Ich habe da ein kleines Problem. Ich möchte gerne Dateien rekursiv suchen und den Pfad in ein " Dyn Array of Record" schreiben. Ich habe mir gedacht ich lagere alle Hilfs-Funktionen in eine eigene Unit aus, nur habe ich da wohl etwas falsch gemacht. Sobald sich im Ordner ausser Unterordner auch Files befinden werden nur noch die Files im Parentordner ins Array geschrieben. Kann sich mal jemand den Code anschauen? Code-Hilfs Unit
Delphi-Quellcode:
Den Record so wie das Array habe ich in Unit1 deklariert, der Aufruf findet in Unit2 statt.
procedure GetAllFiles(var FRec: TMP3Set; dir: string; datei: string; ext: string);
var sr: TSearchRec; r: integer; index: integer; begin index:= Length(FRec); r:= FindFirst(dir+'\*.*', faAnyFile, sr); while r = 0 do begin if copy(sr.Name,1,1)<> '.' then begin if(sr.attr <> 0)and(faDirectory <> 0) then GetAllFiles(Frec,dir+'\'+ sr.Name, datei,ext); end; if (copy(sr.Name,pos('.',LowerCase(sr.Name)),4) = ext) then begin SetLength(Frec,index +1); Frec[index].Pfad:= dir+'\'+sr.Name; inc(index); end; Application.ProcessMessages; r:= FindNext(sr); end; end; Record/ Array deklaration
Delphi-Quellcode:
Hier der Aufruf der Procedure GetAllFiles aus Unit2
type
TID3Tag = packed record Pfad: string[255]; ID: string[3]; Titel: string[30]; Artist: string[30]; Album: string[30]; Year: string[4]; Comment: string[30]; Genre: Byte; end; type TMP3Set = Array of TID3Tag;
Delphi-Quellcode:
grz zer00
GetAllFiles(MP3,dir,'*','.mp3');
|
Re: Dateien rekursiv suchen und in Typisirtes Array schreibe
Mööööp!
Delphi-Quellcode:
Die if-Abfrage ist irgendwie falsch.if copy(sr.Name,1,1)<> '.' then begin if(sr.attr <> 0)and(faDirectory <> 0) then <------------- GetAllFiles(Frec,dir+'\'+ sr.Name, datei,ext); Richtig wäre (ungetestet)
Delphi-Quellcode:
if (sr.Attr and faDirectory) <> 0
|
Re: Dateien rekursiv suchen und in Typisirtes Array schreibe
Hallihallo,
deine Parameterliste würde ich etwas einkürzen. Der Parameter Datei wird momentan nutzlos mitgeschliffen. Nimm doch einfach Parameter Pfad,Mask:string Mask kann z.B. *.mp3 lauten Wenn du damit FindFirst fütterst, dann kannst du dir später die abfrage der Extension sparen die Funktion IncludeTrailingPathDelimiter fürgt übrigens bei bedarf einem Pfad einen '\' an Ein Problem ist definitiv, dass du nach der Rekursion die Array-Länge nicht mehr abfragst. Während der Rekursion ändert sich zwar die Arraylänge aber die Längenvariable bleibt nach dem ersten Zuweisen unverändert. Mir ist auch aufgefallen, dass du von deinem Array nur eine einzige Variable zuweist und der Rest brach liegt. An der Stelle implementierst du bestimmt noch das Auslesen des ID3-Tags? Der rekursive Aufruf muss so oder ähnlich lauten:
Delphi-Quellcode:
Dann probiere ma
if (SR.Attr and faDirectory = faDirectory) //nur Verzeichnisse rek. abgrasen
then GetAllFiles(Frec,IncludeTrailingPathDelimiter(pfad)+sr.Name, mask); Gruß Roedel |
Re: Dateien rekursiv suchen und in Typisirtes Array schreibe
Danke für die Tipps, versuche ich heute abend gleich mal.
Ja, die restlichen Record-Variabeln werde ich dann später noch füllen. grz zer00 |
Re: Dateien rekursiv suchen und in Typisirtes Array schreibe
Hier auch noch was falsches :warn:
Delphi-Quellcode:
richtig ist es so, da ein Datei-/Verzeichnisnamen auch mit einem Punkt anfangen können :zwinker:
if copy(sr.Name,1,1)<> '.' then
(man denke da nur mal an die berümte ".htaccess")
Delphi-Quellcode:
if (sr.Name <> '.') and (sr.Name <> '..') then
Und wir wäre es mit
Delphi-Quellcode:
statt diesem?
if ExtraxtFileExt(sr.Name) then
Delphi-Quellcode:
Wobei die 4 auch nicht gerade gut gewählt ist, denn die dateiendung kann auch mehr als nur 3 Zeichen lang sein.
if copy(sr.Name,pos('.',LowerCase(sr.Name)),4) = ext then
Außerdem, wenn z.B. ext = ".wav" und sr.Name = "irgendwas.waver", dann würde dein Vergleich WAHR sagen, also ".wav" = copy(".waver", 1, 4). |
Re: Dateien rekursiv suchen und in Typisirtes Array schreibe
Noch einmal danke für die Tipps!
Ich werde dann sicher noch mit ein paar Fragen auf euch zukommen. grz zer00 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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