AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateianzahl ermitteln

Ein Thema von mgubler · begonnen am 5. Dez 2003 · letzter Beitrag vom 6. Dez 2003
Antwort Antwort
Seite 1 von 2  1 2      
mgubler

Registriert seit: 14. Jul 2002
Ort: Krefeld
115 Beiträge
 
Delphi 2006 Professional
 
#1

Dateianzahl ermitteln

  Alt 5. Dez 2003, 11:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2

Re: Dateianzahl ermitteln

  Alt 5. Dez 2003, 11:56
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
mgubler

Registriert seit: 14. Jul 2002
Ort: Krefeld
115 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Dateianzahl ermitteln

  Alt 5. Dez 2003, 12:01
Danke für die prompte AW!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Dateianzahl ermitteln

  Alt 5. Dez 2003, 12:26
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Dateianzahl ermitteln

  Alt 5. Dez 2003, 12:41
Moin Himitsu,

müsste auch so gehen, da . und .. Verzeichnisse sind.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Dateianzahl ermitteln

  Alt 5. Dez 2003, 12:58
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#7

Re: Dateianzahl ermitteln

  Alt 6. Dez 2003, 00:11
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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Dateianzahl ermitteln

  Alt 6. Dez 2003, 00:57
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 (siehe OH)


http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9

Re: Dateianzahl ermitteln

  Alt 6. Dez 2003, 09:18
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 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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Dateianzahl ermitteln

  Alt 6. Dez 2003, 10:01
@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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz