Entwickler-Ecke

Dateizugriff - Wie kriege ich die größe eines ordners in MB ???


patrick dee - So 01.06.03 12:47
Titel: Wie kriege ich die größe eines ordners in MB ???
hi

habe ein programm wo ich wave files in einen ordner kopiere. Den pfad wo der ordner ist gebe ich mit einer Edit vor zb C:\waves
so nun soll der Ordner der in der edit eingestellt wurde überwacht werden wie groß er ist. so das mir ein label anzeigen tut wieviel MB er hat.
so das jedesmal wenn ich etwas in den ordner kopiert habe der label mir die änderung der größe anzeigen tut. wird wohl mit einem timer gehen
aber die frage wie ??

danke


patrick


MSCH - So 01.06.03 13:52

hmmm, so auf die Schnelle würde ich via findfirst() und findnext() die Dateien suchen und deren Größe (TSearchRec.Size) summieren. Falls du jedoch auch Unterordner einbeziehen willst, mußt du das ganze auch nch rekursiv für jeden unter- und unter- und unter- (usw) Ordner durchführen.
Klingt schwieriger als es ist:

So und weil heut Sonntag ist, kriegste das ganze als Thread:

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:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
unit Scanner;

interface

uses
  Windows,Classes;

type
  TScanDir = class(TThread)
  private
    dirSize:Integer;
    procedure LeseVerzeichnis(Dir:String);
    procedure SucheAlleDateien;
  protected
    procedure Execute; override;
  public
    Constructor Create;
  end;

implementation
uses Filectrl,SysUtils;



constructor TScanDir.Create;
begin
  inherited Create(true);
  Priority:= tpIdle;
  dirSize:=0;
  Resume;
end;


procedure TScanDir.Execute;
var I: Integer;
begin
  for I:=Ord('C'to Ord('Z'do begin
     if terminated then 
       break;
     LeseVerzeichnis(Chr(I)+':\');
  end;
end;

procedure TScanDir.LeseVerzeichnis(Dir: String);
var SR: TSearchRec;
     I: Integer;
begin
  if terminated then Exit;
  SucheAlleDateien;
  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);// <-- Recursiv
    I:= FindNext(SR);
  end;
  FindClose(SR);
end;

procedure TScanDir.SucheAlleDateien;
var SR:TSearchRec;
     I:Integer;
begin
  I:= FindFirst('*.*',faAnyFile and not faDirectory,SR);
  while I=0 do begin
    Inc(DirSize.SR.SIze); // <------ !!
    I:= FindNext(SR);
  end
  FindClose(SR);
end;


end.


Für ein bestimmtes Verzeichnis, o.g. Thread ließt momentan alle Laufwerke ab, musst du nur in der Execute-Methode den Pfad verändern.

ist der Thread zu ende, kannst du die var dirSize in OnTerminate() des Threads an den Haupttrhead (deine ANwendung) übergeben. Da dieses OnTerminate() bereits im HauptContext läuft, brauchste keine Synchronize() mehr.

have a lot of fun

grez
msch


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt


patrick dee - So 01.06.03 13:59

DANKE

schön so ein sonntag werde es probieren.

ciao

patrick :lol:


Terra23 - So 01.06.03 18:11

Mal nebenbei, MSCH: Was ist ein Thread?


MSCH - So 01.06.03 20:34

Ein Thread ist ein Stück Programm(code) welches Asynchron zum eigentlichen Programm (auch ein Thread) läuft. Ein Tread erhält unabhängig vom Hauptprogramm Rechenzeit zugewiesen. In der konventionellen Methode musst du Application.Processmessage() aufrufen, um nebenbei andere Sachen zu machen. Bei einem Thread brauch man das nicht (ist nebenbei auch sinnlos)
Zum Dienste schreiben brauch man Threads, hmm, eigentlich für alles was so nebenbei laufen kann und soll (Uhrzeit anzeigen, etc.)

Thead und Anwendung dürfen nur unter bestimmten Vorraussetzungen miteinander kommunizieren - z.b. darf ein Thread nur über seine Methode Synchronize() auf VCL (z.b. auf ein TEdit) zugreifen.

Ist ein nettes Thema. Kann dazu nur diverse Fachliteratur empfehlen:
z.b. Delphi 6 Enterprise Handbuch.

grez.
msch