manfred: rekursiv ordnergröße ermitteln - problem in funktion

guten abend,
irgendwie ist bei mir eindeutig der wurm drin..
ihn zu finden scheint mir schirr unmöglich..
wäre sehr dankbar wenn mir einer meinen denkfehler
erklären könnte:

folgende funktion soll rekursiv die größe eines ordners
ermitteln. dazu durchlaufe ich jeden ordner und des
files, deren größe ich in $c_index, speichern möchte.
doch geschieht dieses nicht.
beim aufruf der funktion mit "../personalFolders/manfred/" und 0
(für die startgröße) kommt 0 heraus. debug zeigt folgende aufrufe:
countUsersUsedBytes( ../personalFolders/manfred/ , 0 )
countUsersUsedBytes( ../personalFolders/manfred/manfred/ , 0 )
countUsersUsedBytes( ../personalFolders/manfred/manfred/myOne/ , 244167 )

---code---

function countUsersUsedBytes( $dir, $c_index )
 {

$handle = opendir( $dir );

while( $file = readdir ( $handle ) )
  {

if ( eregi( "^.{1,2}$", $file ) ) continue;

$f_file = $dir.$file;

if( is_dir( $f_file ) )
   {
    countUsersUsedBytes( $f_file."/", $c_index );
   }

if( is_file( $f_file ) )
   {
    $c_index += filesize( $f_file );
   }

}

closedir($handle);

return $c_index;

}
-------

besten dank

manfred m

  1. habe es herausbekommen:
    global $c_index;
    heisst die lösung...

    danke dennoch

    1. Huhu manfred

      habe es herausbekommen:
      global $c_index;
      heisst die lösung...

      das ist nur eine der möglichen Lösungen.
      Im allgemeinen sollte man auf globale Variablen so weit wie möglich verzichten, und meist (eigentlich immer) ist es möglich.

      Wenn Du beim rekursiven Aufruf statt

      countUsersUsedBytes( $f_file."/", $c_index );

      dieses schreibst

      $c_index += countUsersUsedBytes( $f_file."/", $c_index );

      sollte es auch funktionieren.

      Viele Grüße

      lulu

      --
      bythewaythewebsuxgoofflineandenjoytheday
    2. Moin!

      habe es herausbekommen:
      global $c_index;
      heisst die lösung...

      NEIN! Igitt! Mach das bloß nicht!

      Aus Funktionen heraus auf globale Variablen zuzugreifen bringt dich schon bei normalen Funktionen in Teufels Küche. Erst recht bei rekursiven Funktionen.

      Dein Funktion: (gekürzt auf das wesentliche)

      function countUsersUsedBytes( $dir, $c_index )
       {

      ...

      if( is_dir( $f_file ) )
         {
          countUsersUsedBytes( $f_file."/", $c_index );
         }

      ...

      return $c_index;
       }

      Merke: In deiner Funktion gibst du den ermittelten Größenwert von $c_index zurück, aber dort, wo du die Funktion rekursiv aufrufst, nutzt du ihn nicht.

      Kann also nicht funktionieren.

      - Sven Rautenberg

      --
      Die SelfHTML-Developer sagen Dankeschön für aktuell 21205,05 Euro Spendengelder!