Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.
Seite 1 von 2  1 2      

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