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); 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
tommie-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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!