# Ordnergröße ermitteln Alternative



## flokli (10. Juli 2006)

Hallo,

kann man die Größe eines bestimmten Ordners messen, ohne durch das Verzeichnis zu "steppen" wie hier?


```
// ************************************
// ***    dir_functions.lib.php     ***
// ************************************
// -----------------------------------------------------------------------
/*
	Copyright:
	==============
	Dieses Script wurde ursprünglich von Dennis Riehle geschrieben - Sie dürfen
	das Script frei verwenden, bearbeiten und weitergeben, solange dieser Copyright
	Hinweis nicht entfernt wird.
	Es erfolgt keinerlei Haftung für eventuell durch dieses Script entstandene
	Schäden - die Benutzung erfolgt auf eigene Gefahr.

	Beschreibung:
	==============
	Dieses Script enthält ein paar einzelne PHP Funktionen, welche sich bei der
	Arbeit auf dem lokalen File System hilfreich zeigen können.

	Inhalt:
	==============
	- Funktion: dir_up ( string Path )
	- Funktion: dir2array ( string Path [ , bool .ht-Files [ , bool Dot-Files ] ] )
	- Funktion: rm_dir_files ( string Path )
	- Funktion: filesize_dir ( string Path )

	Veränderungen:
	==============
	Die Funktion dir2array() hat bis jetzt auch Datei mit Namen wie xy.htxy ausgefiltert,
	allerdings sollten nur .htxy herrausgefiltert werden, denn in der Apache verbietet
	auch nur auf letztere den Zugriff über HTTP.
*/
// -----------------------------------------------------------------------
function filesize_dir( $dirpath )
{
    // Buffer für Dateigröße initialisieren und auf 0 setzen
    $filesize = 0;
    // Wenn das letzte Zeichen in $dirpath ein Slash ist, diesen entfernen
    if ( substr( $dirpath, -1, 1 ) == "/" ) {
        $dirpath = substr( $dirpath, 0, -1 );
    }
    // Wenn das Verzeichnis nicht geöffnet werden kann, false zurück liefern
    if ( !$handle = opendir( $dirpath ) ) {
        return false;
    } while ( ( $file = readdir( $handle ) ) !== false ) {
        // Die Einträge . und .. auslassen
        if ( $file == "." OR $file == ".." ) {
            continue;
        }
        // Ist der aktuelle Eintrag eine Datei, Größe zum Buffer hinzuzählen
        if ( is_file( $dirpath . "/" . $file ) ) {
            $filesize += filesize( $dirpath . "/" . $file );
        }
        // Sonst, wenn es ein Verzeichnis ist, Funktion erneut aurufen
        // und Rückgabewert addieren
        else {
            $filesize += filesize_dir( $dirpath . "/" . $file );
        }
    }
    // Endergebnis zurückliefern
    return $filesize;
}
// -----------------------------------------------------------------------
```


Gibt es vielleicht nen exec()-Befehl, der das schneller erledigt?
(Er soll Linux und Windows-gebräuchlich sein)


----------



## Dennis Wronka (10. Juli 2006)

Also einen Aufruf fuer exec() der sowohl unter Windows als auch unter Linux klappt wirst Du wohl nicht finden denk ich.
Was ist denn so schlimm an dem Script?


----------



## flokli (10. Juli 2006)

Ich baue einen Art Konqueror mit PHP/Javascript/Ajax... und die Größe auslesen ist bei sehr großen Ordnern (z.B. "/") sehr langsam...

Oder eine andere Frage: Wie würden denn die Befehle heißen, dann kann man ja ein paar ifs und elseifs machen:


```
if($rootrechte_auf dem server)
{
     if($is_unix)
     {
         $foldersize=exec("UNIX_BEFEHL");
     }
     elseif($is_windows)
     {
         $foldersize=exec("UNIX_BEFEHL");
     }
}
else{
     $foldersize=langamer_check();
}
```


----------



## Dennis Wronka (10. Juli 2006)

Unter Linux kannst Du am besten *du*, bzw. *du -h* nutzen.
Aber auch das wird eine ganze Weile dauern.


----------



## flokli (10. Juli 2006)

Und in Windows...Nimmt man da DOS-Befehle!


----------



## Matthias Reitinger (10. Juli 2006)

Hallo,

egal wie's kommt – die Kindelemente müssen immer komplett durchlaufen werden, wenn man die Gesamtgröße eines Verzeichnisses ermitteln will. Keines der gängigen Dateisysteme speichert diese Information irgendwo zwischen.

Grüße,
 Matthias


----------



## cmyk-vienna (10. Juli 2006)

Werden die Kindelemente überhaupt durchlaufen? Unter DOS glaube ich, wird bei einem normalen Verzeichnislisting die Größe von Unterordnern gar nicht ermittelt, oder?
lg


----------



## Dennis Wronka (10. Juli 2006)

Das bringt dann aber nicht wirklich was. Immerhin soll ja die Gesamtgroesse eines Verzeichnisses, inklusive seiner Unterverzeichnisse, festgestellt werden.


----------



## flokli (11. Juli 2006)

Na ja, ich dache, Befehle mit exec() wären schneller, da man ja z.B. in Windoof die "Ordner- & Unterordnergröße" mit einem Tooltip abfragen kann, was ja nicht so lange dauert wie die PHP-Variante... (Windows XP mit XAMPP und PHP5)

Trotzdem danke...


----------

