Kurt: Script macht nicht genau, was ich will

Hallo,

kann mir einer sagen, warum das Script im ersten Durchlauf nicht die Gesamtgröße in mb anzeigt?
Ich erhalte lediglich "fertig mb" angegeben. Wenn ich dann F5 drücke, zeigt mir das Script auch die Gesamtgröße innerhalb des "fertig-Textes" an.

Gruß, Kurt

  
<?  
  
//=========================================================  
// Funktion  
//=========================================================  
  
function check_dir($pfad = './',$max_size = '') {  
$gesamtgroesse = 0;  
  
foreach (glob("*.*") as $filename) {  
//echo "$filename - Größe: " . filesize($filename) . "<br />";  
$gesamtgroesse = $gesamtgroesse + filesize($filename);  
$arr_files[$filename] = filemtime($filename);  
}  
  
// Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30  
  
$gesamtgroesse = round($gesamtgroesse/1048576, 2);  
  
if ($gesamtgroesse > $max_size) {  
// lösche älteste Datei  
	asort($arr_files);  
	$fileNames = array_keys($arr_files);  
	unlink($fileNames[0]);  
    check_dir('./',$max_size);  
  
} else {  
  
return $gesamtgroesse;  
  
}  
  
//=========================================================  
} // end function  
//=========================================================  
  
  
//=========================================================  
//  Scriptsuführung  
//=========================================================  
  
$gesamtgroesse = check_dir('./','100');  
echo("fertig ".$gesamtgroesse." MB");  
exit;  
  
//=========================================================  
  
  
?>  

  1. Lieber Kurt,

    manchmal sieht man den Wald vor lauter Bäumen nicht. Insbesondere Du, der Du Deinen Quelltext nicht einrückst, wirst unter diesem Umstand leiden.

    Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.

      Bitteschön.

        
      <?  
        
      //=========================================================  
      // Funktion  
      //=========================================================  
        
      function check_dir($pfad = './', $max_size = '')  
        {  
          $gesamtgroesse = 0;  
        
          foreach (glob("*.*") as $filename)  
            {  
              //echo "$filename - Größe: " . filesize($filename) . "<br />";  
              $gesamtgroesse = $gesamtgroesse + filesize($filename);  
              $arr_files[$filename] = filemtime($filename);  
            }  
        
          // Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30  
        
          $gesamtgroesse = round($gesamtgroesse / 1048576, 2);  
        
          if ($gesamtgroesse > $max_size)  
            {  
              // lösche älteste Datei  
              asort($arr_files);  
              $fileNames = array_keys($arr_files);  
              unlink($fileNames[0]);  
              check_dir('./', $max_size);  
        
            }  
          else  
            {  
              return $gesamtgroesse;  
        
            }  
        
          //=========================================================  
        } // end function  
      //=========================================================  
        
        
      //=========================================================  
      //  Scriptsuführung  
      //=========================================================  
        
      $gesamtgroesse = check_dir('./', '100');  
      echo ("fertig " . $gesamtgroesse . " MB");  
      exit;  
        
      //=========================================================  
        
      
      
      1. Hello,

        Sobald Dein Code übersichtlicher formatiert ist, werde auch ich mich nicht scheuen, ihn genauer anzuschauen.

        Bitteschön.

        [code lang=php]
        <?

        //=========================================================
        // Funktion
        //=========================================================

        function check_dir($pfad = './', $max_size = '')

        Was ist der Zweck der Funktion?
        Was sollen die beiden Attribute bewirken?

        {
            $gesamtgroesse = 0;

        Wofür steht $gesamtgroesse?

        foreach (glob("*.*") as $filename)

        Bist Du sicher, dass glob() immer ein Ergebnis liefert, dass von foreach() verarbeitet werden kann?
        In welchem Working-Directory soll die Funktion arbeiten? Wieso wird das glob() nicht mitgeteilt? Funktionen sollten doch so allgemeingültig wie möglich sein!

        {
                //echo "$filename - Größe: " . filesize($filename) . "<br />";

        Bist Du dir über die Wirkung von clearstatcache() im Klaren?
        http://de3.php.net/manual/en/function.clearstatcache.php

        $gesamtgroesse = $gesamtgroesse + filesize($filename);

        Warum wird filesize() doppelt aufgerufen? Das mag zwar unter PHP inzwischen so üblich sein, ist aber kein sauberer Programmierstil.

        $arr_files[$filename] = filemtime($filename);
              }

        usw.

        Außerdem sollte eine Funktion zur Beschaffung von Daten keine Daten an die Standardausgabe ausgeben. Trenne immer sauber die Steuerflusskomtrolle, die Datenhaltung, die Datenbeschaffung, die Datenverarbeitung, und die Ergebnisausgabe voneinander. Juppi-Programmierer haben dieser Forderung auch einen eigenen Namen gegeben: MVC-Model.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. Hello,

      manchmal sieht man den Wald vor lauter Bäumen nicht. Insbesondere Du, der Du Deinen Quelltext nicht einrückst, wirst unter diesem Umstand leiden.

      Sobald Dein Code übersichtlicher formatiert ist,

      und kommentiert. Das bedeutet, dass dort steht, was Du dir gedacht hast, was passieren soll und nicht etwa, dass Du nochmal hinschreibst, was passiert.

      werde auch ich mich nicht scheuen, ihn genauer anzuschauen.

      schließe ich mich an...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. und kommentiert. Das bedeutet, dass dort steht, was Du dir gedacht hast, was passieren soll und nicht etwa, dass Du nochmal hinschreibst, was passiert.

        Nochmal Bitteschön:

          
        <?  
          
        //=========================================================  
        // Funktion  
        //=========================================================  
          
        function check_dir($pfad = './', $max_size = '')  
          {  
            $gesamtgroesse = 0;  
          
            // Alle Dateien einlesen  
          
            foreach (glob("*.*") as $filename)  
              {  
                $gesamtgroesse = $gesamtgroesse + filesize($filename);  
                $arr_files[$filename] = filemtime($filename);  
              }  
          
            // Megabyte sind 2 hoch 20 Byte (Binärsystem) / Gigabyte = 2 hoch 30  
          
            $gesamtgroesse = round($gesamtgroesse / 1048576, 2);  
          
          
            // Wenn die kummlulierte Dateigröße/Verzeichnissgröße größer als $max_size (hier 100 MB) ist,  
        	// soll solange die älteste Datei gelöscht werden, bis sie darunter liegt.  
          
          
            if ($gesamtgroesse > $max_size)  
              {  
                // lösche älteste Datei  
                asort($arr_files);  
                $fileNames = array_keys($arr_files);  
                unlink($fileNames[0]);  
          
                // Funktion soll sich selber erneut aufrufen...  
          
                check_dir('./', $max_size);  
          
              }  
            else  
              {  
          
                // ...oder mir die Größe ausspucken.  
          
                return $gesamtgroesse;  
          
              }  
          
        //=========================================================  
          } // end function  
        //=========================================================  
          
          
        //=========================================================  
        //  Scriptsuführung  
        //=========================================================  
          
        $gesamtgroesse = check_dir('./', '100');  
        echo ("fertig " . $gesamtgroesse . " MB");  
        exit;  
          
        //=========================================================  
        
        
  2. Hallo Kurt,

    kann mir einer sagen, warum das Script im ersten Durchlauf nicht die Gesamtgröße in mb anzeigt?

    das macht das Script nur dann, wenn die Maximalgröße überschritten wird.
    So hast Du das programmiert.

    Wird die Maximalgröße nicht überschritten, so wird im ersten Durchlauf die Gesamtgröße in MB angezeigt.

    Wird die Maximalgröße überschritten, so

    <?

    function check_dir($pfad = './',$max_size = '') {

    [...]

    wird in der äußersten Schleife der if-Zweig ausgeführt,

    Nach dem völlig überflüssigen rekursiven Absteigen in

    die Funktion und dem Aufsteigen zurück bist Du in der

    obersten Ebene im if-Zweig und es wird daher nichts

    zurückgegeben.

    if ($gesamtgroesse > $max_size) {
    // lösche älteste Datei
    asort($arr_files);
    $fileNames = array_keys($arr_files);
    unlink($fileNames[0]);
        check_dir('./',$max_size);

    } else {

    return $gesamtgroesse;

    }
    } // end function

    //=========================================================
    //  Scriptsuführung
    //=========================================================

    $gesamtgroesse = check_dir('./','100');
    echo("fertig ".$gesamtgroesse." MB");
    exit;
    ?>

    und daher kann auch nichts ausgegeben werden.

      
    Neben der bereits [von Tom geäußerten Kritik](https://forum.selfhtml.org/?t=209433&m=1425399), dass Du nichts mit dem übergebenen Pfad anfängst, kann Deine Funktion wunderbar in ein Speicherlimit laufen, weil Du für jede zu löschende Datei im rekursiven Aufruf erneut und zusätzlich den Verzeichnisinhalt in ein neues Array einliest, dieses sortierst, ...  
      
    Vorschlag:  
    Statt des rekursiven Aufrufs gehe besser wie folgt vor:  
      
    Solange die Gesamtgröße größer ist als der erlaubte Maximalwert und noch Dateien vorhanden sind  
        Merke Dir die Dateigröße der Datei, die Du löschen willst.  
        Wenn das Löschen der Datei erfolgreich war,  
            ziehe diese Größe von der Verzeichnisgesamtgröße ab  
        Ende Wenn  
        Entferne die Datei aus dem Array  
        (auch wenn sie nicht gelöscht werden konnte, damit Du nicht endlos  
         hängen bleibst)  
    Ende solange  
    Gib die neue Gesamtgröße zurück  
      
      
    Freundliche Grüße  
      
    Vinzenz