Entwickler-Ecke

Dateizugriff - Anzahl der Dateien auf Laufwerk ermittlen?


Akut-Programming - Di 26.08.03 21:00
Titel: Anzahl der Dateien auf Laufwerk ermittlen?
Ist es möglich alle Dateien auf einem Laufwerk zu zählen? Es sollte schnell gehen, da ich es in einer Suche(Progressbar) verwenden will.


Delete - Di 26.08.03 21:24

Suche in: Delphi-Forum, Delphi-Library FINDFIRST, Suche in: Delphi-Forum, Delphi-Library FINDNEXT. Und bitte mal einen Blick in die FAQ werfen.


MSCH - Di 26.08.03 21:33

jeap geht, aber schnelligkeit hängt von Platte und Rechner ab:
schau dir mal FindFirst() und FindNext() an. Das sind die gesuchten Funktionen. Dann das ganze noch etwas rekursiv verbasteln und fertig.

zum bleistift so:
(ich habs mal aus meinen Threadcode rauskopiert):

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:
procedure TScanDir.Execute;
var I: Integer;
begin
  for I:=Ord('C'to Ord('Z'do begin // Alle Laufwerke
     if terminated then 
       break;
     LeseVerzeichnis(Chr(I)+':\');
  end;
end;

procedure TScanDir.LeseVerzeichnis(Dir: String);
var SR: TSearchRec;
     I: Integer;
begin
  sucheDateien(dir);
  I:= FindFirst(IncludeTrailingBackslash(dir)+'*.*',faAnyFile,SR);
  while I=0 do begin
    if (SR.Attr and faDirectory = faDirectory)and
       (SR.Name<>'.')and(SR.Name<>'..'then
         LeseVerzeichnis(IncludeTrailingBackslash(Dir)+SR.Name);
    I:= FindNext(SR);
  end;
  FindClose(SR);
end;

procedure TScanDir.SucheAlleDateien(_Dir:String);
var SR:TSearchRec;
     I:Integer;
begin
     I:= FindFirst( IncludeTrailingBackslash(_Dir)+'*.*',FaAnyFile and not faDirectory,SR);
     while I=0 do begin
     // <--- hier globalen Zähler erhöhen, oder was mit der Datei machen
         I:= FindNext(SR);
     end// while findfile
      FindClose(SR);
end;


grez
msch

//EDIT da war ich etwas zu spät //EDIT


Akut-Programming - Mi 27.08.03 14:24

Sorry MSCH, aber dat funzt nich so richtig.

Hier nochma meine Problematik:

Ich will in meinem "DateiBrowser" eine Suchfunktion einbauen. Das suchen ansich klappt auch schon supi. Nur will ich dem Nutzer auch zeigen können, das gerade gesucht wird. Ich hatte es mir so vorgestellt, das ich bei jeden Start der Suche den maximal Wert meiner Progressbar auf die Anzahl der Dateien auf dem gewählten Laufwerk setzte und somit eben die ProgressBar genau dann beim max Wert stoppt, wenn die Suche beendet ist. Ist das so möglich oder stell ich es mir zu einfach vor? :roll:


Delete - Mi 27.08.03 14:39

Ist nicht möglich. Die Anzahl der Dateioen weißt du ja nicht, bzw. erst, wenn du sie alle gefunden hast.

Nicht umsonst nimmt MS selber diese kleine AVI-Datei mit der suchenden Lupe, um den Suchvorgang zu visualisieren.


Gausi - Mi 27.08.03 14:47

Kann man das mit der Statusbar nicht über die Dateigröße machen?
Also den belegten Speicherplatz des Laufwerkes mit DiskSize und DiskFree ermitteln. Bei einer gefundenen Datei die Größe mit Filesize bestimmen, zu den bisher abgearbeiteten Bytes hinzuzählen und daraus den Wert der Progressbar bestimmen.
Frag mich aber nicht, um wieviel die Suche dadurch langsamer wird. Probier mal aus, ob sich da an der Geschwindigkeit was tut...


Akut-Programming - Mi 27.08.03 14:52

Wenn ich einfach nur die Gesamtzahl der Bytes jeder Datei nehmen würde, hätt ich am Ende eine rießen Zahl, zumindest wenn es in byte bleibt, durch die die Progressbar nicht so schnell am ende sein ankommt.
:lol: Ich kann dann nachner Datei suchen und in ner Woche bekomm ich das Ergebnis :lol:

Aber die Idee mit dem der DiskSize gefällt mir, daran werd ich mal basteln!!

Danke trotzdem für deine Hilfe!!!


Brueggendiek - Mi 27.08.03 21:46

Hallo!

Der Vorschlag, über den belegten Platz und die Dateigröße eine Fortschrittsanzeige laufen zu lassen, ist echt was für'n Popo, denn:
1. ermittelt die belegte Größe nach Clustern, die Dateigröße aber den echten (in der Regel kleineren) Wert. Kann man noch ausgleichen, indem man auf Clustergröße aufrundet,
2. belegen auch die Ordner Speicherplatz. Mir ist zur Zeit kein Weg bekannt, den von einem Ordner belegten Platz rauszubekommen - wen interessiert das denn überhaupt bei den heutigen Plattengrößen?

Fazit: Der Ansatz klingt erst mal gut, aber die Anzeige käme nie am Ende (100%) an!

Gruß

Dietmar Brüggendiek


Akut-Programming - Do 28.08.03 08:03

Öhm.... :oops: ich seh schon! Da werd ich mir wohl was anderes überlegen müssen. Na ma kucken...! :eyecrazy:


Gausi - Do 28.08.03 17:22

Das meine Idee nicht ganz 100%ig funktioniert, ist mir auch klar. Aber es ist ein Ansatz, der gegenüber dem Dateien-Zählen machbar ist.
Und wenn die eben nicht ganz bei 100% ankommt: meine Güte, dann ist das Suchen eben schneller beendet worden, die Anzeige wird meinetwegen noch schnell auf 100 hochgesetzt, und der User ist happy, dass alles ein bissel schneller fertig geworden ist. :D
Und alle Anzeigen können auch nicht immer 100%ig stimmen. Schonmal große Datenmengen von Platte zu Platte kopiert und dabei die Windows-Anzeige "verbleibende Restdauer" beobachtet? Das sind auch alles nur Schätzwerte, die sich stark verändern, jenachdem, ob in den zu kopierenden Daten grad ein 700MB großes CDImage oder 100 Einzel-Icons dran sind!

Zusatz: Bezugnehmend auf den Patente-Thread in Off-Topic weise ich noch darauf hin, dass die Fortschrittsanzeige patentrechtlich geschützt ist. Pass also auf, dass du mit deinem Programm keinen Ärger mit IBM bekommst ;-)


Akut-Programming - Fr 29.08.03 07:53

Hmm hast eigentlich recht! Ich werds einfach mal einbauen.

Gausi hat folgendes geschrieben:

...Das meine Idee nicht ganz 100%ig funktioniert, ist mir auch klar....

Das wollt ich damit auch nich sagen