Verzeichnissgröße ermitteln.

Hallo,

ich habe ja schon einige Varianten durch, doch immer wieder stößt man an die Grenzen von PHP, nun hab ich die 4096 MB Grenze erreicht und eine Variante gefunden mit der die Dateigröße und Verzeichnisgröße ermittelt werden kann.
Im Moment mache ich es über das dir Command von Windows.


$command = "dir /-c " . escapeshellarg($file);
$cmd = exec($command, $out, $err);

Funktioniert auch, denke aber wenn ich alle Verzeichnisse scanne belastet das das System zu stark.
Deshalb hab ich mir das Tool Disk Usage (DU) von Microsoft besorgt.
Jetzt zu mein Problem, rufe ich das Programm über exec auf läuft es unendlich und es kommt auch kein String zurück.
Auch mit IPS_Execute hatte ich keinen Erfolg.
Kann ich das irgend wie ändern?

Schöne Grüße
Thomas

Hallo Thomas!

Das geht auch eleganter, Stichwort: „FilesystemIterator“.

http://php.net/manual/en/class.filesystemiterator.php

Kommst Du damit klar?

Hallo,

muss ich mir mal ansehen, mal sehen was man damit machen kann.

Schöne Grüße
Thomas

Hallo,

geht anscheinend nicht eleganter :-).
Die Datei Größen stimmen leider auch hier nicht.


<?
$iterator = new DirectoryIterator('c:\ip-symcon\db');
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        echo $fileinfo->getFilename() . " " . $fileinfo->getSize() . "
";
    }
}
?>

Liefert 78858240. Real ist es aber 4373833728.

Wie bekomme ich den die DU.exe Rückgabe in IPS?

Schöne Grüße
Thomas

Liefert 78858240. Real ist es aber 4373833728.

Die Idee ist gut, aber größer als 2G ist wohl ein Problem.

Hinweis:

Weil PHPs Integer Typ vorzeichenbehaftet ist und viele Platformen 32bit Integer verweden, können einige Dateisystem-Funktionen für Dateien größer als 2GB unerwartete Ergebnisse liefern.

Tommi

Hier gibt es ein Projekt welches sich mit dem Thema beschäftigt hat.
Eine wirkliche Lösung haben Sie auch nicht aber immerhin eine LIB, die das Problem umgeht.
Ich würde das mal in Kombination mit der entsprechenden „Iterator-Class“ versuchen.

Auf der Shell zu arbeiten bzw. eine EXE zu starten finde ich aber wirklich nicht elegant.