reHi,
hier mal die lösung für dein erstes problem:
imo musst du tatsächlich alles selber zusammenzählen. mir ist kein anderer weg bekannt.
das ganze funktioniert mit einer rekursiven funktion, die sich für jedes unterverzeichniss immer wieder selber aufruft.
hier mal eine unit dafür:
aufruf erfolgt mit
var aPathInfo: TPathInfo;
begin;
aPathInfo := GetPathInfo(aPath, SysFiles);
end;
dabei ist:
aPath: der pfad, ab dem durchstucht werden soll
(zB: C:, C:\Windows\)
babei ist es egal, ob der pfad am ende einen '\' hat
SysFiles
ist SysFiles 'True' werden auch systemdateien/-ordner
mit eingebunden (zB: Recycled)
aPathInfo liefert das ergebnis:
aPathInfo.SubDirectorys: Anzahl Unterverzeichnisse
.Files : Dateien
.FileSize : Größe der Dateien in Bytes
-> ACHTUNG:
FileSize ist ein Extended. du wandelst ihn in einen string
mit s := FloatToStr(aPathInfo.FileSize);
so, hier nun die unit:
unit hddinfo;
// -
interface
uses SysUtils;
// -
type
TPathInfo = record
SubDirectorys, Files: Integer;
FileSize : Extended;
end;
// -
function GetPathInfo(aPath: String; SysFiles: Boolean): TPathInfo;
// -
implementation
// -
{
#-------------------------------------------------------#
| interne Funktionen #
#-------------------------------------------------------#
}
// prüft, ob Eintrag nicht in Liste darf (Systemdateien, '.', '..', usw)
function IsSystemDir(SR: TSearchRec; SysFiles: Boolean): Boolean;
begin
Result := False;
if ((SR.Attr and faDirectory) \> 0) and (SR.Name[1] = '.') then Result := True;
if not SysFiles then
if ((SR.Attr and faSysFile) \> 0) then Result := True;
end;
// -
// prüft, ob Eintrag Directory ist
function IsDirectory(SR: TSearchRec): Boolean;
begin
Result := False;
if ((SR.Attr and faDirectory) \> 0) then Result := True;
end;
// -
// die eigentliche Schleife
procedure MakePathInfo(aPath: String; var aPI: TPathInfo; SysFiles: Boolean);
var SR: TSearchRec;
begin
// an Pfad ggf einen Backslash anhängen
if aPath[Length(aPath)] '\' then aPath := aPath+'\';
// FindFirst ---------------------------------------------------------------
if FindFirst(aPath+'\*.\*', faAnyFile, SR) = 0 then
if not IsSystemDir(SR, SysFiles) then
if IsDirectory(SR) then begin
inc(aPI.SubDirectorys);
MakePathInfo(aPath+SR.Name, aPI, SysFiles);// Rekursiver Aufruf
end
else begin
inc(aPI.Files);
aPI.FileSize := aPI.FileSize+SR.Size;
end;
// FindNext ----------------------------------------------------------------
while FindNext(SR) = 0 do
if not IsSystemDir(SR, SysFiles) then
if IsDirectory(SR) then begin
inc(aPI.SubDirectorys);
MakePathInfo(aPath+SR.Name, aPI, SysFiles);// Rekursiver Aufruf
end
else begin
inc(aPI.Files);
aPI.FileSize := aPI.FileSize+SR.Size;
end;
// Ende Durchlauf-----------------------------------------------------------
FindClose(SR);
end;
// -
{
#-------------------------------------------------------#
| Einsprungfunktionen #
#-------------------------------------------------------#
}
function GetPathInfo;
begin
// löschen des Ergebnisrecords
with Result do begin
SubDirectorys := 0;
Files := 0;
FileSize := 0;
end;
// Aufruf der Pfadfunktion
MakePathInfo(aPath, Result, SysFiles);
end;
// -
end.
ich hoffe, es hilft dir weiter.
CU, DiJey
PS: Die // - mußte ich einfügen, da wer-weiss-was sonst die leerzeilen gelöscht hätte. du kannst die in delphi wieder gegen leerzeilen ersetzen.