Wieviel Platz belegt ein Verzeichnis

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kleinbreuer
    antwortet
    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.

    Einen Kommentar schreiben:


  • Titus
    antwortet
    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:
    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;

    $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 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/"truefalse);
        }
        else
        {
          
    $data['files'] ++;
          
    $data['size'] += $fs filesize($dir.$fn)
          if (
    $overhang $fs%$cs)
            
    $data['slack'] += $cs $overhang;
        }
      }
      
    closedir($dp);
      return 
    $data;

    Einen Kommentar schreiben:


  • Kleinbreuer
    antwortet
    Ja klar....du hast ja dann Individualsoftware.

    Bei mir soll es aber kompatibel bleiben....deshalb das Problem

    Einen Kommentar schreiben:


  • kressevadder
    antwortet
    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:


  • Kleinbreuer
    antwortet
    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:


  • kressevadder
    antwortet
    Wie wärs damit:

    PHP-Code:
    <?


    $befehl="du -s {verzeichnisname}";
    $ausgabe=exec ($befehl);
    echo $ausgabe;

    ?>
    "du" hat noch ein paar schöne Optionen.

    Gruss Manfred

    Einen Kommentar schreiben:


  • Kleinbreuer
    antwortet
    Ok, cool....danke.

    Ich probier mal deine Lösung, vielleicht ist die ja etwas performanter

    Einen Kommentar schreiben:


  • mrhappiness
    antwortet
    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 machen
    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;

    oder halt per shellskript aber ich mach's so wie oben (weil shellskript wie du ja ganz richtig sagtest nich überall tut)
    Zuletzt geändert von mrhappiness; 09.06.2003, 09:44.

    Einen Kommentar schreiben:


  • Kleinbreuer
    antwortet
    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:


  • kressevadder
    antwortet
    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:


  • Seikilos
    antwortet
    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:


  • Kleinbreuer
    antwortet
    @Seikilos: Wie ist das denn in dem Fall dann mit Subdirs?

    Einen Kommentar schreiben:


  • Kleinbreuer
    antwortet
    Ich mach das zur Zeit noch so:

    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;

    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

    Einen Kommentar schreiben:


  • Seikilos
    antwortet
    http://de2.php.net/manual/de/function.filesize.php klappt auch bei ordnern

    Einen Kommentar schreiben:


  • kressevadder
    hat ein Thema erstellt Wieviel Platz belegt ein Verzeichnis.

    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, Manfred
Lädt...
X