Verzeichnisgrößen ermitteln und in Array schreiben

  • Hallo zusammen,
    habe gerade irgendwie eine (gedankliche) Blockade, hoffe aber hier geholfen zu bekommen.

    Ich will/muss auf diversen Servern die jeweiligen Größen der vorhandenen Directories ermitteln.
    Die Serven haben sowohl physikalische LW als auch logische (LUN's).

    Nach Mappen des jeweilen Serverlaufwerkes (DriveMapAdd), erzeuge ich mittels _FileListToArray ein Array mit den vorhanden Directorys.
    Soweit - so gut


    Der nächste Schritt - denke ich zumindest - ist ein

    For $i = 1 To $aFileList[0]$iFreeSpace = DriveSpaceFree($aFileList[i])

    $aDirSize = $iFreeSpace$iFreeSpace <----- und das soll jetzt auch noch der Dir Name ($aFileList[i]) mit ins Array geschrieben werden

    Next

    und jetzt hängt es bei mir. Folgendes sollte passieren:


    Es soll wieder ein Array erzegut werden in dem zum einen der Dir Name (also $aFileList[i]) und zum zweiten die Grösse (also $iFreeSpace) geschrieben wird.

    Zum Ende soll dann dieses Array (_ArrayDisplay()) angezeigt werden.


    Hier mein Versuch soweit:


    Danke schon einmal im voraus für die Tips/ Hilfe

    Gruss
    ugt100

  • So funktionierts:

  • Bin kein Netzwerkexperte aber ich vermute das sollte für alle Ordner der gleiche Wert werden, da der frei Speicher auf dem jeweiligen Laufwerk ermittelt wird.
    In deinem Fall also der von M:\.

    @ Kanashius
    Die Windows-API bringt übrigens schon Funktionen für derartige Formatierungen mit:

    AutoIt
    Func _formatBytes($d_Bytes)
       ; by AspirinJunkie
       Local $a_Ret = DllCall("Shlwapi.dll", "WSTR", "StrFormatByteSizeW", "INT64", $d_Bytes, "WSTR", "", "UINT", 128)
       If @error Or Not IsArray($a_Ret) Then Return SetError(1, @error, "")
       Return $a_Ret[2]
    EndFunc


    Vorteil daran: Die Zahlenformatierung passt sich der jeweiligen Region an. (z.b. Komma als Dezimaltrennzeichen in Deutschland)

  • Hallo Aspirin Juie,

    nei n so ist das nicht wirklich.
    Zur besseren Anschaulichkeit hier mal ein Beispiel:
    Mit _FileListToArray("M:\", "*", 2, "True") ;List folders only hole ich mir die Verezicnisse die unter dem Stamm M:\ zu finden sind.

    Z.B.
    M:\abc
    M:\def
    M:\ghi
    M:\jkl
    zu diesen (Unter)Verzeichnissen benötige ich jetzt den 'FreeSpace'

    Letztlich sollte die Anzeige des ErgebnisArrays wie folgt aussehen:
    M:\abc 12,1 GB
    M:\def 8,7 GB
    M:\ghi 10,5 GB
    M:\jkl 14,4 GB


    Ich offe jtzt ist es verständlich - oder ?

    gruss + danke
    ugt100

  • Hallo Kanashius


    danke für die schnelle Antwort. Leider zeigt Dein Script -zumindest bei mir - keinerlei Ergebnisse an.
    Es läuft fehlerfrei durch und das wars.


    Zur besseren Anschaulichkeit hier mal ein Beispiel:
    Mit _FileListToArray("M:\", "*", 2, "True") ;List folders only hole ich mir die Verezicnisse die unter dem Stamm M:\ zu finden sind.


    Z.B.
    M:\abc
    M:\def
    M:\ghi
    M:\jkl
    zu diesen (Unter)Verzeichnissen benötige ich jetzt den 'FreeSpace'


    Letztlich sollte die Anzeige des ErgebnisArrays wie folgt aussehen:
    M:\abc 12,1 GB
    M:\def 8,7 GB
    M:\ghi 10,5 GB
    M:\jkl 14,4 GB


    Ich offe jtzt ist es verständlich - oder ?


    gruss + danke
    ugt100



  • Ich habe das schon so verstanden wie du es beschrieben hast aber ich frage mich was das für eine Information sein soll.
    Wie werden diese Maximalgrößen (Kontingente?) für einzelne Ordner denn festgelegt?
    In einem lokalen Dateisystem unter Windows kenne ich keine Möglichkeit für sowas.
    Ich vermute mit DriveSpaceFree kommst du da nicht ran, da er nicht die Ordner sondern das Laufwerk an sich betrachtet.

  • Hi Aspirin Junkie

    doch das funktioniert weil das letztlich eingehängte (also quasi per Link) Festplatten(stapel) sind.
    Zu Fuss kannst Du Dir das LW z.b. M:\ mappen, wechselst dann in M:\123 und machst ein Dir auf der Command Line.
    Dann bekommst Du so etwas:

    438 Datei(en), 146.520.160.353 Bytes
    0 Verzeichnis(se), 36.318.412.800 Bytes frei

    oder du schaust Dir das Ganze über den (Windows) Diskmanager an

  • Hallo ugt100,

    ich habe vor einer Weile mit AutoIt ein Programm zum erstellen von Datei- und Verzeichnis Index geschrieben. Dabei wird außer der Datei und Verzeichnisindexes auch die jeweiligen Größen ausgegeben und natürlich auch der freie Laufwerks-Speicherplatz.
    .
    Es ist nichts superdolles (es gibt luxoriösere Software) aber es funktioniert soweit sehr gut für meine Zwecke.

    Du kannst es Dir ja mal anschauen ob Dir damit geholfen wäre. Falls ja, stelle ich gerne den Code etwas abgespeckt hier gerne online, ohne mein persönliches Geraffel. Könnte ja sein dass es Dir weiterhilft. Es erstellt prima Indexes im Netzwerk (da dauert es halt etwas länger) als auch lokal (da geht es superfix). Es beruht auf einer CMD Ausgabe für einen Index (dir /n /os /4 /s > index.txt). Wenn Du mit "dir help" im CMD die Parameter anschaust, ist sicher auch etwas für Dich dabei, oder besser gesagt etwas dabei, was Dich weiterbringen könnte. Der entscheidende Code in AutoIt für den "txt" Index lautet RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index.txt' & '"', "", @WorkingDir, @SW_HIDE)

    Jetzt hoffe ich mal, dass meine Suchhilfe für Dich, mir hier nicht als Schleichwerbung angeschaut wird. Das solls nicht sein. Suche in Kuugle (oder so ähnlich) nach "Easy-Index Maker | EDV".

    Ich bevorzuge (auch wenn es hier nicht so gerne gesehen wird) die Ausgabe der CMD. Funktioniert super für meine Zwecke, ist schnell und ist bereits formatiert. Ist aber Geschmackssache.

  • Hallo bazii,

    Danke für Deine Antwort und den Tip.
    Ich mache jetzt letzlich eine Mischng aus den Vorschlägen.Ich liste die für mich relavaten Verzeichnisse (LUN's) jetz mit einem CMD command (dir *. | FIND /I "<V"),schreibe das in Array,entferne die überflüssigen Informationen mittels StringHandling aus dem Array und nutze dann ein Autoit Script
    (auf Basis dessen von Kanashius und meinem eigenen Anteil).

    Das klappt soweit und gut ist


    Gruss
    ugt100