Entwickler-Ecke

Dateizugriff - Anzahl der Dateien in einem Ordner


salmanasar - So 10.10.04 22:30
Titel: Anzahl der Dateien in einem Ordner
gibts ne funktion mit der ich rausfinde, wieviele Dateien sich in einem ordner befinden?

danke
Salmanasar


.Chef - So 10.10.04 22:39
Titel: Re: Anzahl der Dateien in einem Ordner
salmanasar hat folgendes geschrieben:
gibts ne funktion mit der ich rausfinde, wieviele Dateien sich in einem ordner befinden?

Jup, FindFirst, FindNext und FindClose. 8) Vielleicht gibts auch 'ne API-Funktion dafür, kann mich aber an keine erinnern ... :gruebel:

Gruß,
Jörg


salmanasar - So 10.10.04 22:44

das hab ich auch schon mal gelesen. kannste das mal in nen code einbauen, hab leider keine ahnung, wie ich die benutzen kann um dateien zu zählen.

vielleicht haste ja irgendwo noch einen code-fetzel rumliegen
danke
salmanasar


.Chef - So 10.10.04 22:49


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  sr : TSearchRec;
  fa, a : Integer;
begin
  fa:=faAnyFile-faDirectory-faVolumeID;
  a:=0;
  if FindFirst('*',fa,sr) = 0 then
  begin
    repeat
      Inc(a);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;


it0101 - Do 14.10.04 21:11

Ich verwende schon seit ewigkeiten diese variante, hab aber jetzt erstmals probleme damit...
wenn ich mit faAnyFile suche, dann gibt es bestimmte dateien die nicht gefunden werden (in meinem fall eine datei mit der kennung "Systemdatei", selbst die MS-DOS Konsole zeigt die nich an...

aber ich hab mit meinem admin-login zugriff auf die datei!

Wie komm ich an das file per findfirst ran?


.Chef - Do 14.10.04 21:26

Such mal explizit nach Systemdateien. Wird die dann angezeigt?


it0101 - Do 14.10.04 21:57

nein leider nicht, fasysfile bringt auch nix


it0101 - Do 14.10.04 22:08

so damit ihr nich denkt ich bin zu doof zum proggen, hier mal mein provisorischer quelltext :) (findet alles ausser die dateien in dem verzeichnis)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button3Click(Sender: TObject);
var sr:Tsearchrec;
begin
     if FindFirst('C:\Dokumente und Einstellungen\User\Anwendungsdaten\Microsoft\cryptneturlcache\content\*.*', faanyfile, sr) = 0 then begin
      repeat
        if (faanyfile and Sr.Attr = fasysfile ) then
        begin
             listbox1.Items.add(sr.name);
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
     end;
end;


ich hab das original verzeichnis einfach mal drin gelassen... könnt ja mal schauen was bei euch in dem verzeichnis ist

PS: benutze "W2K SP4"


mfg toby

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


.Chef - Do 14.10.04 22:11

Mit explizit meinte ich:


Delphi-Quelltext
1:
 if FindFirst('...', fasysfile, sr) = 0 then                    


K.A., obs einen Unterschied macht, aber probieren geht über ...


it0101 - Do 14.10.04 22:23

... studieren


habs grad getestet hat aber nix gebracht


it0101 - Do 14.10.04 22:33

Hmmm ich hab mir grad ma die datei angeschaut...

Sie besitzt keine dateiendung, (lasse im Explorer alle endungen anzeigen)
wird aber vom explorer als "Systemdatei" bezeichnet...

hmm sehr merkwürdig, vielleicht sollte ich in dem lieber nen Systemexperten zu rate ziehen :)


.Chef - Do 14.10.04 22:35

Aha. :idea: Keine Endung! Suche mal nach '*' anstatt nach '*.*'!


it0101 - Do 14.10.04 23:06

Ist ne gute idee bringt aber nix, habs mit ../* und mit ../*. versucht aber funzt nich...
hab zum test mal ne normale datei ins verzeichnis kopiert und die wird problemlos gefunden...


jasocul - Fr 15.10.04 10:26


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button3Click(Sender: TObject);
var sr:Tsearchrec;
begin
     if FindFirst('C:\Dokumente und Einstellungen\User\Anwendungsdaten\Microsoft\cryptneturlcache\content\*.*', faanyfile, sr) = 0 then begin
      repeat
// FALSCH !!!!!!!!!
        if (faanyfile and Sr.Attr = fasysfile ) then
// RICHTIG:
        if (Sr.Attr AND fasysfile > 0then
        begin
             listbox1.Items.add(sr.name);
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
     end;
end;


Grund:
Bei deiner Bedingungsabfrage würde dir eine Datei, die auch noch versteckt, wäre nicht angezeigt werden!


it0101 - Fr 15.10.04 14:50

Ja ich habs heute früh noch hinbekommen. Nur mit faAnyFile...

Denn rein theoretisch beinhaltet ja faAnyFile schon alle Dateiarten, auch versteckte und Systemdateien.


jackie - So 06.02.05 13:26

Hi Leute,

bin noch blutiger Anfänger. Aber das wird schon noch. Ich habe mir den Code gerade mal angesehn. Ich möchte nun aber die tatsächliche Anzahl der Dateien in einem Ordner ausgegeben haben.

Die Ausgabe ist relativ egal. Wichtig wäre nur die Anzahl.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var sr:Tsearchrec;
begin
     if FindFirst('D:\Programmierung\Delphi\Progs\Bilderverwaltung\Bilder\*', faanyfile, sr) = 0 then begin
      repeat
      //  if (faanyfile and Sr.Attr = fasysfile ) then
       if (Sr.Attr  > 0then
        begin
             listbox1.Items.add(sr.name);
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
     end;
end;


Wie stelle ich das am besten an. Hintergrund ist folgender. Ich habe einen Ordner der soll max. 1024 Dateien beinhalten. Wenn man diesem Ordner eine weitere Datei hinzufügt, dann soll ein neuer Ordner erstellt werden und diese Datei soll dann im neuen Ordne eingefügt werden.

Um diese Funktion zu erstellen, dachte ich wäre es sinnvoll wenn man mit der Anzahl der Dateien in einem Ordner arbeitet.

Bsp. \Grafik\000001\000001-001024.jpg wenn jetzt 001025.jpg hinzugefügt wird, dann soll ein neuer Ordner erstellt werden und in desem soll dann auch das Bild 001025.jpg eingefügt werden. Das würde dann so aussehn. \Grafik\000002\001025-......

Kann mir jemand da mal nen Tipp geben?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Sprint - So 06.02.05 14:00

jackie hat folgendes geschrieben:
Ich möchte nun aber die tatsächliche Anzahl der Dateien in einem Ordner ausgegeben haben.

Dafür kannst du FindFirst & FindNext benutzen. Als Attr übergibts du faAnyFile und als Platzhalter *.*, damit alle Dateien gesucht werden. Dann musst du nur noch das Ergebnis überprüfen, ob es sich nicht um ein Verzeichnis handelt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function AnzahlAnDateienInDiesemOrdner(const Pfad: String): Integer;
var
  SR: TSearchRec;
begin

  Result := 0;
  if FindFirst(IncludeTrailingPathDelimiter(Pfad) + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if not ((SR.Attr or faDirectory) = SR.Attr) then
        Inc(Result);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;

end;


jackie - So 06.02.05 14:25

Vielen Dank erstmal. Ich habe da allerdings noch ein Problem und zwar wenn ich den Code ausführe bekomme ich die Meldung das IncludeTrailingPathDelimiter ein undefinierter Bezeichner ist. In der Delphi Hilfe steht nichts von IncludeTrailingPathDelimiter. Das einzige was ich da gefunden habe ist IncludeTrailingBackslash(const S: string): string ( MIt IncludeTrailingBackslash wird an einen Pfadnamen (angegeben im Parameter S) der Backslash (\) angehängt. Falls S bereits mit einem Backslash endet, gibt IncludeTrailingBackslash eine Kopie von S zurück.) :(


Sprint - So 06.02.05 14:30

IncludeTrailingPathDelimiter gibt es nicht unter Delphi 5. Aber du kannst beruhigt IncludeTrailingPathDelimiter durch IncludeTrailingBackslash ersetzen.


jackie - So 06.02.05 14:41


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function AnzahlAnDateienInDiesemOrdner(const Pfad: String): Integer;
var
  SR: TSearchRec;
begin

  Result := 0;
  if FindFirst(IncludeTrailingPathDelimiter(Pfad) + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if not ((SR.Attr or faDirectory) = SR.Attr) then
        Inc(Result);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;

end;


Für den Pfad setzte ich doch z.B. D:\Programmierung\Delphi\Progs\Bilderverwaltung\Bilder\ oder?
Wenn ich das mache, dann bekomme ich die Meldung "Ungültiger Wert der Eigenschaft"

Ich glaub ich raff es nicht. :roll:

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Sprint - So 06.02.05 14:47


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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function AnzahlAnDateienInDiesemOrdner(const Pfad: String): Integer;
var
  SR: TSearchRec;
begin

  Result := 0;
  if FindFirst(IncludeTrailingBackslash(Pfad) + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if not ((SR.Attr or faDirectory) = SR.Attr) then
        Inc(Result);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Anzahl: Integer;
begin

  Anzahl := AnzahlAnDateienInDiesemOrdner('D:\Programmierung\Delphi\Progs\Bilderverwaltung\Bilder\');
  ShowMessage(IntToStr(Anzahl));

end;

end.


jackie - So 06.02.05 14:56

Vielen vielen dank,

wenn ich mir den Code so ansehe, dann ist das eigentlich gar nicht so schwer. So wie es aussieht fehlen mir noch ein paar Basics. Sprint ich danke dir erstmal :D


jackie - Sa 12.02.05 18:10

Hi Leute,

ich habe zu diesem Thema nochmal eine Frage.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 

function AnzahlOrdnerImGrafikOrdner(Const Pfad: String): Integer;
var
  SR: TSearchRec;

  begin
    Result:= 0;
    if FindFirst((Pfad), faDirectory, SR)= 0 then
      begin
       repeat
         if  (faDirectory = SR.Attr) then
          Inc(Result);
       until FindNext(SR) <> 0;
      end;
    end;


Der Ordner der geprüft werden soll hat 2 Unterordner. In dieser Funktion aber ermittelt er mir nur einen. Es sollten aber 2 sein.

Bsp.: c:\Ordner\Ordner1 und Ordner2

Die Funktion gibt immer 1 zurück. Kann mir jemand mal nen Tipp geben?

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Sprint - Sa 12.02.05 18:22

jackie hat folgendes geschrieben:
Der Ordner der geprüft werden soll hat 2 Unterordner. In dieser Funktion aber ermittelt er mir nur einen. Es sollten aber 2 sein.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function AnzahlOrdnerImGrafikOrdner(const Pfad: String): Integer;
var
  SR: TSearchRec;
begin

  Result := 0;
  if FindFirst(IncludeTrailingBackslash(Pfad) + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr or faDirectory) = SR.Attr then
        if not (SR.Name = String('.')) and not (SR.Name = '..'then
          Inc(Result);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;

end;