Das ist doch mal ne feine Antwort, vielen dank Titus.
Das mit den Clustern hab ich natürlich nicht bedacht, aber du hast Recht. Muß ich wohl noch etwas umstricken.....werde auch mal die Performance deiner Funktion testen.
Wieviel Platz belegt ein Verzeichnis
Einklappen
X
-
Bisher wurde hier der slack space (also der "verschwendete" Speicher) nicht berücksichtigt. Wieviel Platz von einer Datei tatsächlich belegt wird, hängt nicht nur von ihrer Größe sondern auch von der Cluster-Größe auf dem Datenträger ab:$data = dir_size(..., $true); print_r($data); liefert genau die Daten, die Windows auch als Ordner-Eigenschaften liefert: Anzahl der Dateien ($data['files']) und Ordner ($data['dirs']) inklusive Unterverzeichnisse, benutzter ($data['size']) und belegter ($data['size']+$data['slack']) Speicherplatz.PHP-Code:function cluster_size($dir)
{
// Cluster-Größe = Platz, der für eine 1-Byte-Datei belegt wird
if (substr($dir,-1))!='/') $dir.='/';
@unlink($dir. 'slackdetect.txt');
$fp = fopen($dir. 'slackdetect.txt', 'w');
fputs($fp, '*');
fclose($fp);
$df = disk_free_space($dir);
unlink ($dir. 'slackdetect.txt');
return disk_free_space($dir) - $df;
}
PHP-Code:function dir_size($dir, $recurse=false, $reset=true)
{
// $dir gibt das Verzeichnis an
// $recurse: wenn true, dann Unterverzeichnisse mitzählen
// $reset: nur für internen Gebrauch
static $data=array(), $cs = 0;
if ($reset)
{
$data=array(
'dirs' => 0,
'files' => 0,
'size' => 0,
'slack' => 0
);
$cs = cluster_size($dir);
}
$dp = opendir($dir);
if (substr($dir,-1))!='/') $dir.='/';
while ($fn = readdir($dp))
{
if ($is_dir($dir.$fn))
{
$data['dirs'] ++;
if ($recurse)
dir_size("$dir$fn/", true, false);
}
else
{
$data['files'] ++;
$data['size'] += $fs = filesize($dir.$fn)
if ($overhang = $fs%$cs)
$data['slack'] += $cs - $overhang;
}
}
closedir($dp);
return $data;
}
Einen Kommentar schreiben:
-
Ja klar....du hast ja dann Individualsoftware.
Bei mir soll es aber kompatibel bleiben....deshalb das Problem
Einen Kommentar schreiben:
-
Ja klar, funzt mit win natürlich nicht. Man könnte vielleicht ne Abfrage machen ob win oder unix läuft, unkomlizierter wirds dadurch nicht.
Mit dem SafeMode bzw. wenn dein Provider garkeine Scripts zulässt gibts natürlich auch Schwierigkeiten.
In meinem Fall stört das allerdings nicht, weil das Ding eh nur unter Linux auf meinem Intranetserver läuft, und da ist es garantiert der schnellste und fehlerunanfälligste Weg.
Gruss
Einen Kommentar schreiben:
-
Mein Problem ist:
1. Funzt das mit Windoof Systemen nicht
2. Wenn PHP Safe-Mode läuft sind die exec Befehle IMO gesperrt
Oder wie sieht es damit aus?
Einen Kommentar schreiben:
-
Wie wärs damit:
"du" hat noch ein paar schöne Optionen.PHP-Code:<?
$befehl="du -s {verzeichnisname}";
$ausgabe=exec ($befehl);
echo $ausgabe;
?>
Gruss Manfred
Einen Kommentar schreiben:
-
Ok, cool....danke.
Ich probier mal deine Lösung, vielleicht ist die ja etwas performanter
Einen Kommentar schreiben:
-
das manual? *g*Original geschrieben von Kleinbreuer
Hat einer jetzt ne Ahnung ob das mit fileSize($dir) auch klappt?
ausporbieren?
wird aber nicht gehen, denk eich
du kannst es unter php höchstens mittels rekursion machenoder halt per shellskript aber ich mach's so wie oben (weil shellskript wie du ja ganz richtig sagtest nich überall tut)PHP-Code:function dir_size($dir)
{
$totalsize=0;
if ($dirstream = @opendir($dir))
{
while ($filename = readdir($dirstream))
if ($filename!='.' and $filename!='..')
{
if (is_file($dir.'/'.$filename))
{
$info=stat($dir.'/'.$filename);
if ($info['blksize']!=-1)
$totalsize=$info['blksize']*$info['blocks'];
else
$totalsize+=filesize($dir.'/'.$filename);
}
if (is_dir($dir.'/'.$filename))
$totalsize+=dir_size($dir.'/'.$filename);
}
closedir($dirstream);
}
return $totalsize;
}
Zuletzt geändert von mrhappiness; 09.06.2003, 09:44.
Einen Kommentar schreiben:
-
Shell Script ist bei mir um den Faktor 10 schneller, aber ich kann es halt net machen, weil bei manchen Systemen das net flüppt......
Hat einer jetzt ne Ahnung ob das mit fileSize($dir) auch klappt?
In meinem konkreten Fall hat das Ding keine SUbdirs
Einen Kommentar schreiben:
-
mhh,
man kommt wohl nicht drum rum, alles "durchzuwalken", da scheint mir ein Shellscript doch komfortabler. Dadurch geht aber die Platformunabhängigkeit flöten!
Einen Kommentar schreiben:
-
Logisch= Subdirs werden mit berechnet.
Wirklichkeit= keine ahnung
Wenn du nur den inhalt ohne dirs haben willst, musst du die einzelnen Files durchballern und addieren
Einen Kommentar schreiben:
-
@Seikilos: Wie ist das denn in dem Fall dann mit Subdirs?
Einen Kommentar schreiben:
-
Ich mach das zur Zeit noch so:
Da müßte es aber auch was schnelleres geben, mit exec könnte man auch einen Linux Command machen, wäre schneller aber das will ich auch nicht.PHP-Code:function getFileList($dirname) {
$files = array();
$dir = opendir( $dirname );
while( $file = readdir( $dir ) )
{
{
$files[] = $file;
$countfiles++;
}
}
return $files;
}
function getDirSize($dir) {
$files = getFileList($dir);
$data = 0;
for ($i = 0; $i < Count($files); $i++) {
if (is_dir($dir.$files[$i]) && $files[$i] != "." && $files[$i] != "..") {
$data += getDirSize($dir.$files[$i]."/");
}
else {
if (file_exists($dir.$files[$i]) && $files[$i] != "." && $files[$i] != "..")
$data += filesize($dir.$files[$i]);
}
}
return $data;
}
Zur Zeit ist es so ok, aber für was schnelleres wäre auch ich dankbar
Einen Kommentar schreiben:
-
http://de2.php.net/manual/de/function.filesize.php klappt auch bei ordnern
Einen Kommentar schreiben:
-
Wieviel Platz belegt ein Verzeichnis
Hallo,
kann ich mit PHP rausfinden, wieviel Platz ein verzeichnis belegt?
Ich finde nur Funktionen, die Auskunft geben, was noch frei ist (diskfreespace,disk_total_space).
Danke, ManfredStichworte: -
Einen Kommentar schreiben: