D5: größe verzeichnis bestimmen/verz. umbennennen

der titel könnte ruhig etwas länger sein dürfen… :frowning:

also, erstens möchte die die größe eines verzeichnisses mit allen unterverzeichnissen/dateien bestimmen können, so wie wenn ich im explorer eigenscaften anklicke, dann zählt er ja auch alles… (muss ich etwa auch alle dateien suchen/zusammenzählen!?)

zweite frage, wie kann ich ein verzeichnis umbenennen??
mit renamefile klappt das nicht immer!, offenbar nur wenn das verz. ziemlihc leer ist?

ok, vielen dank im voraus!
Thomas

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.