Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateianzahl ermitteln (https://www.delphipraxis.net/12856-dateianzahl-ermitteln.html)

mgubler 5. Dez 2003 10:49


Dateianzahl ermitteln
 
Hallo zusammen,

ich habe folgende Frage:
ich habe einen Ordner mit mehreren Unterordnern und n Dateien.
Wie kann ich ermitteln, wie viele Dateien sich insgesamt in
diesem Hauptordner (incl. Unterordnern) befinden?

Bin für jede Hilfe dankbar!!!

Danke im voraus,
Marc

Sanchez 5. Dez 2003 10:56

Re: Dateianzahl ermitteln
 
hi,

z.B. so:

Delphi-Quellcode:
function FileCount(_ordner : string): integer;
var files   : TSearchRec;
    count : integer
begin
  count := 0;
  if FindFirst(ordner + '\*.*',faAnyFile or faDirectory, files) = 0 then begin
    repeat
      if (files.Attr and faDirectory) = faDirectory then begin
     count := count + FileCount(_ordner + '\' + files.Name);
   end else begin
        count := count + 1;
      end;
    until FindNext(files) <> 0;
    FindClose(files);
  end;
  result := count;
end;
Das ist ein ungetesteter Ansatz. Evtl passt da irgendwas noch nicht

grüße, daniel

mgubler 5. Dez 2003 11:01

Re: Dateianzahl ermitteln
 
Danke für die prompte AW!

himitsu 5. Dez 2003 11:26

Re: Dateianzahl ermitteln
 
Einen kleinen Teil soltest du aber noch ändern:
Code:
[s]end else begin
  count := count + 1;
end;[/s]
in
Code:
[s]end else begin
  if (files.Name <> '.') and (files.Name = '..') then
    count := count + 1;
end;[/s]
Sonst stimmt die Anzahl der Dateien nicht.

Der Rest dürfte so funktionieren.


http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Christian Seehase 5. Dez 2003 11:41

Re: Dateianzahl ermitteln
 
Moin Himitsu,

müsste auch so gehen, da . und .. Verzeichnisse sind.

himitsu 5. Dez 2003 11:58

Re: Dateianzahl ermitteln
 
:oops: Ups, das kommt davon, wenn man den Namen vor der Unterscheidung auf Datei/Verzeichnis prüft.
Hab nochmal nachgeguckt - Christian hat also Recht.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Brüggendiek 5. Dez 2003 23:11

Re: Dateianzahl ermitteln
 
Hallo!

@himitsu: Im Prinzip hattest Du doch Recht mit "." und ".." - nur hast Du das an der falschen Stelle geprüft!

Der Code von Sanchez zählt nämlich auch die Directories "." und ".." mit - eindeutig ein schwerer Fehler! Deine Abprüfung muß also beim Directory-Zweig stehen.

Mit einer Hilfsvariablen wird es übrigens noch einfacher (verkürzt auf den sinngebenden inhalt):
Delphi-Quellcode:
var code:integer;

code := FindFirst(...)
while code = 0 do
begin
  ... tu was mit gefundenem
  code := findnext(...);
end;
Gruß

Dietmar Brüggendiek

himitsu 5. Dez 2003 23:57

Re: Dateianzahl ermitteln
 
OK, dann also so:
Delphi-Quellcode:
Function FileCount(Ordner: String): Integer;
  Var Files: TSearchRec;
    Count: Integer;

  Begin
    If (Ordner > '') and (Ordner[Length(Ordner)] <> '\') Then Ordner := Ordner + '\';
    Count := 0;
    If FindFirst(Ordner + '*.*', faAnyFile, Files) = 0 Then Begin
      Repeat
        If (Files.Attr and faDirectory) <> faDirectory Then Inc(Count)
        Else If (Files.Name <> '.') and (Files.Name <> '..') Then
          Inc(Count, FileCount(Ordner + Files.Name + '\');
      Until FindNext(Files) <> 0;
      FindClose(Files);
    End;
    Result := Count;
  End;
Ich hab den Code gleich mal etwas optimiert:
Delphi-Quellcode:
Count := Count + 1;
{=}
Inc(Count);
In faAnyFile ist faDirectory schon drin :wink: (siehe OH)

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

MathiasSimmack 6. Dez 2003 08:18

Re: Dateianzahl ermitteln
 
Zitat:

Zitat von himitsu
Die andere Variante hat aber einen Nachteil: [...] Wenn FindFirst nichts findet, liefert FindClose einen Fehler.

Welcher Fehler soll das sein? Will sagen: ich sehe keinen. Nur wenn du direkt mit der API-Funktion "FindFirstFile" arbeitest, musst du prüfen ob das Rückgabeergebnis ungleich INVALID_HANDLE_VALUE ist. Nur dann darfst du "FindClose" (API) aufrufen.

Aber Borland weiß das auch:
Zitat:

Zitat von SysUtils.pas
Delphi-Quellcode:
procedure FindClose(var F: TSearchRec);
begin
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(F.FindHandle);
    F.FindHandle := INVALID_HANDLE_VALUE;
  end;
end;

;)

himitsu 6. Dez 2003 09:01

Re: Dateianzahl ermitteln
 
@Mathias:
wenn das doch geht, dann tut es mir sehr leid.
Es ist nur so, das es früher bei mir zu Fehlermeldungen geführt hat. (Delphi 4 Standard)


Gut, dann geht es auch noch mal nach dir:
Delphi-Quellcode:
Function FileCount(Ordner: String): Integer;
  Var Files: TSearchRec;
    Count, Code: Integer;

  Begin
    If (Ordner > '') and (Ordner[Length(Ordner)] <> '\') Then Ordner := Ordner + '\';
    Count := 0;
    Code := FindFirst(Ordner + '*.*', faAnyFile, Files) = 0 Then Begin
    While Code = 0 do Begin
      If (Files.Attr and faDirectory) <> faDirectory Then Inc(Count)
      Else If (Files.Name <> '.') and (Files.Name <> '..') Then
        Inc(Count, FileCount(Ordner + Files.Name + '\');
      Code := FindNext(Files);
    End;
    FindClose(Files);
    Result := Count;
  End;
Jetzt ist zwar im gegensatz zur vorherigen Version ein Integer mehr da, aber dafür ein IF weniger.
Hab mir auch noch mal dir OH angeguckt - die vorherige Variante ist mehr nach der OH.

Muß jetzt halt jeder selber entscheiden, was ihm/ihr besser gefällt.

[OT]
nochmal @ Mathias:
es haben sich mittlerweile ja auch noch andere Probleme von selbst behoben.
z.B. gab es Fehlermeldungen, wenn ich ein leeres Array mit SetLength(irgend ein Array, 0); nochmal auf Length = 0 setzte.

Der folgende Code ist jetzt auch schon bei mir überflüßig geworden:
If Length(Array) <> 0 Then SetLength(Array, 0);
[/OT]


http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

MathiasSimmack 6. Dez 2003 09:57

Re: Dateianzahl ermitteln
 
Hallo? Das war keine Kritik. Wenn es bei Delphi 4 nicht funktioniert hat, dann wird Borland da evtl. genau diesen Teil mit der Prüfung vergessen haben. Hätte ja auch sein können, dass du einen ganz anderen Fehler entdeckt hast.

Also, nichts für ungut.

Was mir aber wirklich gefällt, ist der Satz:
Zitat:

Zitat von himitsu
wenn das doch geht, dann tut es mir sehr leid.

Der hat das Zeug zu einer Signatur. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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