Announcement

Collapse
No announcement yet.

Ordnergröße bestimmen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ordnergröße bestimmen

    Ho<br>
    Der Windows-Explorer in Windows NT 4.0/SP6 (Dateisystem NTFS) liefert auf meinem Rechner unterschiedliche Ergebnisse, wenn ich die Eigenschaften des Winnt-Verzeichnisses anzeigen lasse: mal ist es 255.183.244 Byte groß, mal sind es 255.171.960 Byte. Das passiert ohne sichtbare Dateiaktionen; zwischen den verschiedenen Anzeigeergebnissen habe ich nur die Eigenschaften mehrerer Verzeichnisse anzeigen lassen. Mit Windows 2000 (SP2/FAT 32) und Windows 98 (FAT 16) habe ich dieses Problem nicht. Ist das ein Bug in Windows NT?
    Anderseits zeigt folgende function stets die gleichen Ergebnisse an:
    <pre>

    function DirSize(Path:string):Int64;
    var
    sr : TSearchRec;
    err : Integer;
    begin
    Result := 0;
    if Path[Length(Path)]<>'\' then Path:=Path+'\';
    err := FindFirst(Path + '*.*', faAnyFile, sr);
    while (err = 0) do
    begin
    if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name[1]<>'.') then
    Result := Result + DirSize(Path + sr.Name)
    else
    Result := Result + sr.Size;
    err := FindNext(sr);
    end;
    FindClose(sr);
    end;

    Oder hat diese Funktion einen Fehler?</pre>

  • #2
    Hi

    1.) <b>
    if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name[1]<>'.') then </b>

    ist nicht ganz richtig. Es kann nämlich Ordner mit namen wie '.XYZ' oder '..XYZ' usw geben. Ausschließlich
    <pre>

    if (SR.Attr and faDirectory <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then ;

    </pre>
    ist korrekt, da nur Ordner die NICHT '.' und NICHT '..' heisen gescannt werden. Die Annahme das der Punkt '.' in einem Ordenernamen NICHT existieren darf ist eine reine MS-DOS Bedingung und gilt NICHT für neuere Systeme.

    2.) <b>SR.Size</b> gibt die tatsächliche Größe der Datei an, aber NICHT den Verbrauch auf der Platte, da diese in Clustern mit fester Länge abgelegt wird. Dabei kann EIN Cluster nur von EINER Datei oder einem Teil EINER Datei belegt werden. Will man den Verbrauch einer Datei berechnen muss Size := SR.Size + ClusterSize - SR.Size mod ClusterSize gerechnet werden, also auf ein Vielfaches der Clustergröße der Partition.

    3.) die <b>Berechnung</b> der freien Festplattenkapazität kann variieren, das liegt hauptsächlich daran das das Betriebssystem wie ein Datenbanksystem mit "temporären" Daten arbeitet und nicht unbedingt immer auf dem neuesten Stand gehalten wird.

    Gruß Hage

    Comment

    Working...
    X