Avatar billede supermand69 Nybegynder
04. november 2002 - 19:33 Der er 16 kommentarer og
1 løsning

størrelse for mappe med undermapper

Hey

hvordan kan jeg beregne en mappes størrelse og med alle undermapper??
Avatar billede tipsen Nybegynder
05. november 2002 - 01:14 #1
Du laver en funktion som tager et mappenavn som inputargument og returnerer størrelsen af de filer der ligger i mappen!

Derefter skal den bare kalde sig selv rekursivt, hvis den støder på et nyt bibliotek - pseudokode for hvordan det skal hænge sammen er:

function FolderSize($folder) {
  $CurrentFolderSize = 0;
  åbn folder
  loop over filer og mapper i $folder
    if(is_file(nuv. fil/mappe)) {
      $CurrentFolderSize += filesize(nuv. fil);
    }
    else {
      $CurrentFolderSize += FolderSize($folder/$nuv. mappe);
    }
  }
  return $CurrentFolderSize;
}
Avatar billede supermand69 Nybegynder
05. november 2002 - 15:06 #2
jamen tager den ikke kun den angivne mappe + 1 niveau ned...??

hvad nu hvis der er 3 eller flere niveau ned i mappe?? Hvis du ved hvad jeg mener?
Avatar billede supermand69 Nybegynder
05. november 2002 - 21:17 #3
jeg kan sq ikke helt få det til at virke som det skal... jeg kan godt nok så sammentalt bytes for det valgte dir, men ikke for subdirs

function dir_size($dir)
{
    $current_dir = $dir;
    $dir = opendir($dir);
   
    while($file = readdir($dir))
    {
        if(is_file($file)) $current_dir_size += filesize($file);
        else
        {
            if($file != '..' && $file != '.')
            {
                $subdir = $current_dir.'/'.$file;
                echo $subdir.'<br>';
                //$current_dir_size += dir_size($subdir);
            }
        }
    }
   
    closedir($dir);
   
    return $current_dir_size;
}
Avatar billede tipsen Nybegynder
05. november 2002 - 21:17 #4
det er derfor funktionen kalder sig selv, hvis den får fat i et bibliotek - på den måde får du fat i samtlige undermapper - det er det som forstås ved en rekursiv funktion!
Avatar billede tipsen Nybegynder
06. november 2002 - 12:25 #5
Du har udkommenteret den linie som sørger for det rekursive - derfor får du kun størrelsen for det aktive niveau!
Avatar billede supermand69 Nybegynder
06. november 2002 - 12:55 #6
det ved jeg, men den virker ikke alligevel... kan du ikke lige hjælpe mig?

jeg kan ikke hitte ud af det :(
Avatar billede tipsen Nybegynder
06. november 2002 - 16:00 #7
Grunden til at den hopper i havet er at du overskriver inputargumentet ($dir) med et dirhandle i linien $dir = opendir($dir); - det er dumt!

Tilpasset den pseudokode jeg skrev til dig ser det sådan ud:

function dir_size($dir) {
  $current_dir_size = 0;
  $handle = opendir($dir);
  while(($file = readdir($handle)) !== false) {
    if(is_file($file)) {
      $current_dir_size += filesize($file);
    } elseif($file != '..' && $file != '.') {
      $current_dir_size += dir_size("$dir/$file");
    }
  }
  closedir($handle);
  return $current_dir_size;
}

brug funktionen:

echo dir_size('mappenavn');
Avatar billede supermand69 Nybegynder
08. november 2002 - 16:40 #8
Jeg kan sq stadig ikke få det til at virke... får følgende fejl:

Warning: OpenDir: Invalid argument (errno 22) in S:\HTTP\_www\test.php on line 4

Warning: readdir(): supplied argument is not a valid Directory resource in S:\HTTP\_www\test.php on line 5



Her er min kode som jeg har pastet fra dig:

function dir_size($dir) {
  $current_dir_size = 0;
  $handle = opendir($dir);
  while(($file = readdir($handle)) !== false) {
    if(is_file($file)) {
      $current_dir_size += filesize($file);
    } elseif($file != '..' && $file != '.') {
      $current_dir_size += dir_size("$dir/$file");
    }
  }
  closedir($handle);
  return $current_dir_size;
}

echo dir_size('s:/dc');
Avatar billede tipsen Nybegynder
08. november 2002 - 17:29 #9
så har du ikke fodret den med et gyldigt bibliotek...
Avatar billede tipsen Nybegynder
08. november 2002 - 17:30 #10
Prøv forøvrigt at læse user-comments på http://dk.php.net/manual/en/function.opendir.php

Det kunne meget vel være problemet.
Avatar billede tipsen Nybegynder
08. november 2002 - 17:32 #11
prøv med følgende i stedet for $handle = open...;

if(($handle = opendir($dir)) === false) die("Biblioteket kan ikke åbnes");
Avatar billede supermand69 Nybegynder
13. november 2002 - 00:29 #12
Mappen som jeg prøver at finde størrelsen på et lokalt... altså ikke på netværk eller tilsluttet netværksdrev...

jeg kan bare ikke forstå hvorfor jeg ikke kan få det til at virke når du kan få det til at virke hos dig...

du har måske testet det?? :)
Avatar billede supermand69 Nybegynder
13. november 2002 - 00:49 #13
jeg får forresten fejlen "Biblioteket kan ikke åbnes"
Avatar billede tipsen Nybegynder
13. november 2002 - 00:52 #14
Jeg tester næsten aldrig noget af det jeg skriver på eksperten, men beklager at måtte meddele, at der faktisk var fejl i dette - det er jeg ked af!

Rettet udgave:

function dir_size($dir) {
  $current_dir_size = 0;
  if(($handle = opendir($dir)) === false) die("Biblioteket $dir kan ikke åbnes");
  while(($file = readdir($handle)) !== false) {
    $curfile = $dir . '/' . $file;
    if(is_file($curfile)) {
      $current_dir_size += filesize($curfile);
    } elseif(is_dir($curfile) && $file != '..' && $file != '.') {
      $current_dir_size += dir_size($curfile);
    }
  }
  closedir($handle);
  return $current_dir_size;
}

echo dir_size('./images') . " bytes";
Avatar billede supermand69 Nybegynder
13. november 2002 - 01:05 #15
hehe...

mange tark.. :)
Avatar billede tipsen Nybegynder
13. november 2002 - 01:11 #16
you're welcome - havde faktisk ikke helt forstået hvordan is_file() og is_dir() fungerer - men nu har jeg lært noget nyt :-)
Avatar billede supermand69 Nybegynder
13. november 2002 - 01:29 #17
man lærer jo noget nyt hver eneste dag :)

så blev du jo det klogere
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester