Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - CLX: Dateien auflisten [gelöst]
lemming - Di 29.07.03 15:07
Titel: CLX: Dateien auflisten [gelöst]
Hallo!
Ich habe in dem unterverzeichnis /projects meines progs mehrere Dateien die *.prj heissen. Wie kann ich diese mir auflisten lassen?
btw. Es ist eine CLX Anendung und sollte ohne viel gefummele später auch auf Linux laufen.
-lemmi
lemming - Di 29.07.03 15:12
:autsch: manchmal sieht man halt den wald vor lauter bäumen nicht. FindFirst und FindNext sind DIE LÖSUNG!
Klabautermann - Di 29.07.03 15:20
*g*
Jaja, man denkt so gerne zu kompliziert.
Interessant wird es dann wenn du Linux-Spezifische informationen (z.B. Dateirechte) auslesen willst.
Gruß
Klabautermann
lemming - Di 29.07.03 15:34
Na da war ich wohl zu schnell. Ich raff das nicht so ganz mit FindFirst, FindNext und FindClose.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var sr: TSearchRec; begin FindFirst('c:\', 63, sr); repeat ShowMessage(sr.Name); until FindNext(sr) <> 0; FindClose(sr); end; |
ich hab hier diesen code jetzt. Zum testen nehm ich jetzt halt mal c:\. Aber der gibt mir nix zurück. Hab ich was mit denn Attributes falsch gemacht? Das ist die 63. Hab ich mir mal chnell ausgerechnet.[/code]
maximus - Di 29.07.03 15:53
nach ein paar modifikationen könnte das funktionieren :wink:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| if FindFirst(dir, Attr, sRec) = 0 then begin if (sRec.Attr and Attr) = sRec.Attr then begin showMessage(sRec.Name); end; while FindNext(sRec) = 0 do begin if (sRec.Attr and Attr) = sRec.Attr then begin showMessage(sRec.Name); end; end; FindClose(sRec); end; |
PS: Attr ist die attribut-maske und dir zb. 'c:\'
lemming - Di 29.07.03 16:02
So klappts. man muss wildcards eingeben um mit findnext was zu finden.
:mahn:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.Button1Click(Sender: TObject); var sRec: TSearchRec; dir: String; Attr: Integer; begin
dir := 'c:\*.*'; Attr := faAnyFile;
if FindFirst(dir, Attr, sRec) = 0 then begin if (sRec.Attr and Attr) = sRec.Attr then begin showMessage(sRec.Name); end;
while FindNext(sRec) = 0 do begin if (sRec.Attr and Attr) = sRec.Attr then begin showMessage(sRec.Name); end; end;
FindClose(sRec); end; end; |
:beer: Danke!
AndyB - Di 29.07.03 16:23
Und warum schreibst du den Schleifen-Code doppelt?
Mit repeat until braucht man den nur einmal:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if FindFirst(Pfad, Attr, SearchRec) = 0 then try repeat ShowMessage(SearchRec.Name); until FindNext(SearchRec) <> 0; finally FindClose(SearchRec); end; |
Ein Try-Finally sollte bei FindFirst nicht fehlen. Es ist auch nicht gut, wenn FindClose aufgerufen wird, wenn FindFirst 0 zurück liefert, da es sonst zum Überschreiben von Speicher kommen kann (ein Bug in Windows).
Klabautermann - Di 29.07.03 16:38
Hallo,
| AndyB hat folgendes geschrieben: |
Und warum schreibst du den Schleifen-Code doppelt?
Mit repeat until braucht man den nur einmal: |
dann hast du aber das Problem, das es zu fehlern kommt, wenn keine Datei gefunden wird, daher benötigst du die zusätzliche IF Bedingung. Daher würde ich eine Kopfterminite-Schleife mit Hilfsvariable bevorzugen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| VAR FindRes : LongInt; begin FindRes := FindFirst(Pfad, Attr, SearchRec); try while (FindRes=0) do begin ShowMessage(SearchRec.Name); FindRes := FindNext(SearchRec); end; finally FindClose(SearchRec); end; end; |
So hat jeder seine vorlieben ;)
Gruß
Klabautermann
AndyB - Di 29.07.03 16:43
| Klabautermann hat folgendes geschrieben: |
| dann hast du aber das Problem, das es zu fehlern kommt, wenn keine Datei gefunden wird |
Hää? Das kann ich nicht nachvollziehen.
Wenn keine Datei gefunden wird, liefert FindFirst <> 0 zurück, wodurch der try/finally Block nicht ausgeführt wid. Wenn eine Datei gefunden wurde, wird der Schleifen-Körper ausgeführt. Nun kommt FindNext. Wird keine Datei gefunden, liefert FindNext <> 0 zurück und die Schleife wird beendet, wodurch auf FindClose ausgeführt wird. Findet FindNext eine Datei/Ordner, so wird der Schleifenkörper erneut ausgeführt.
| Zitat: |
| So hat jeder seine vorlieben |
Darüber lässt sie eben nicht streiten. Aber man kann trotzdem seinen Stil anderen Zeigen. Vielleicht gefällt einem der ja besser oder auch nicht.
lemming - Di 29.07.03 16:46
²AndyB
| Zitat: |
| Wenn eine Datei gefunden wurde, wird der Schleifen-Körper ausgeführt |
wo wir schon mal die erste Datei verpasst hätten. ;)
lemming - Di 29.07.03 16:47
Oh sorry, hab nicht genau hingegugt. Du hast ja eine Fußgesteuerte Schleife verwendet :nut:
lemming - Di 29.07.03 16:50
²AndyB,
es kommt wirklich zu keinem Fehler wenn keine Dateien gefunden wurden. Danke für diese elegante Lösung :)
Klabautermann - Di 29.07.03 17:23
Hallo,
| AndyB hat folgendes geschrieben: |
| Klabautermann hat folgendes geschrieben: | | dann hast du aber das Problem, das es zu fehlern kommt, wenn keine Datei gefunden wird |
Hää? Das kann ich nicht nachvollziehen. |
bitte weiterlesen:
| Kalabautermann hat folgendes geschrieben: |
| dann hast du aber das Problem, das es zu fehlern kommt, wenn keine Datei gefunden wird, daher benötigst du die zusätzliche IF Bedingung. |
Das deine lösung funktioniert ist unumstritten.
| AndyB hat folgendes geschrieben: |
| Darüber lässt sie eben nicht streiten. Aber man kann trotzdem seinen Stil anderen Zeigen. Vielleicht gefällt einem der ja besser oder auch nicht. |
Das sollte auch keine Kritik an deinem Postings sein. Es war nur eine allgemeine und nicht wertende feststellung. Ich war nur erfreut wie viele korreckte Lösungen lemming hier geboten bekommt.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!