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:
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