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=0do 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