Autor Beitrag
patrick dee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: So 01.06.03 12:47 
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

_________________
Glauben heißt nichts wissen ...
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: So 01.06.03 13:59 
DANKE

schön so ein sonntag werde es probieren.

ciao

patrick :lol:

_________________
Glauben heißt nichts wissen ...
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 01.06.03 18:11 
Mal nebenbei, MSCH: Was ist ein Thread?

_________________
Hasta La Victoria Siempre
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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