Archiv verlassen und diese Seite im Standarddesign anzeigen : Wieviel Platz belegt ein Verzeichnis
kressevadder 08-06-2003, 17:33 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, Manfred
Seikilos 08-06-2003, 17:45 http://de2.php.net/manual/de/function.filesize.php klappt auch bei ordnern
Kleinbreuer 08-06-2003, 17:47 Ich mach das zur Zeit noch so:
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;
}
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.
Zur Zeit ist es so ok, aber für was schnelleres wäre auch ich dankbar :D
Kleinbreuer 08-06-2003, 17:51 @Seikilos: Wie ist das denn in dem Fall dann mit Subdirs?
Seikilos 08-06-2003, 17:53 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
kressevadder 08-06-2003, 17:57 mhh,
man kommt wohl nicht drum rum, alles "durchzuwalken", da scheint mir ein Shellscript doch komfortabler. Dadurch geht aber die Platformunabhängigkeit flöten!
Kleinbreuer 09-06-2003, 10:20 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 :cool:
mrhappiness 09-06-2003, 10:32 Original geschrieben von Kleinbreuer
Hat einer jetzt ne Ahnung ob das mit fileSize($dir) auch klappt?das manual? *g*
ausporbieren?
wird aber nicht gehen, denk eich
du kannst es unter php höchstens mittels rekursion machenfunction 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;
}oder halt per shellskript aber ich mach's so wie oben (weil shellskript wie du ja ganz richtig sagtest nich überall tut)
Kleinbreuer 09-06-2003, 11:36 Ok, cool....danke.
Ich probier mal deine Lösung, vielleicht ist die ja etwas performanter :rolleyes:
kressevadder 09-06-2003, 12:01 Wie wärs damit:
<?
$befehl="du -s {verzeichnisname}";
$ausgabe=exec ($befehl);
echo $ausgabe;
?>
"du" hat noch ein paar schöne Optionen.
Gruss Manfred
Kleinbreuer 09-06-2003, 18:37 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?
kressevadder 09-06-2003, 20:31 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
Kleinbreuer 10-06-2003, 11:08 Ja klar....du hast ja dann Individualsoftware.
Bei mir soll es aber kompatibel bleiben....deshalb das Problem :(
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: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;
}
$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.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;
}
Kleinbreuer 12-06-2003, 13:49 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.
|
-
- |