Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: как посчитать размер директори?
Форумы портала PHP.SU » » Работа с файловой системой и файлами » как посчитать размер директори?

Страниц (1): [1]
 

1. anton-logom - 10 Января, 2014 - 18:23:50 - перейти к сообщению
Здравствуйте, подскажите пожалуйста.
Нужно, чтобы сценарий подсчитывал в кб размер определенной директории (файлы и вложенные в неё директории, если есть).

Использовал такую функцию, которая вроде бы должна все это выполнять:
PHP:
скопировать код в буфер обмена
  1. function dir_size($d){
  2. $dh = opendir( $d );
  3. $size = 0;
  4. while( ( $f = readdir( $dh ) ) !== false )
  5. {
  6. if ( $f != "." && $f != ".." )
  7.  {
  8.   $path = $d . "/" . $f;
  9.    if( is_dir( $path ) )
  10.      {  $size += dir_size( $path );  }
  11.          elseif( is_file( $path ) )
  12.             {  $size += sprintf("%u", filesize($path));  }
  13.             }
  14.         }
  15.  closedir($dh);
  16.  $fileSize = round( $size / 1024 , 2 );
  17. return $fileSize;
  18. }


но на деле оказалось, что она считает только объем файлов в директории (без учета размера подкаталогов).

Никак не пойму в чем проблема, помогите!
2. gefard - 10 Января, 2014 - 18:54:35 - перейти к сообщению
anton-logom пишет:
Здравствуйте, подскажите пожалуйста.
Нужно, чтобы сценарий подсчитывал в кб размер определенной директории (файлы и вложенные в неё директории, если есть).

Использовал такую функцию, которая вроде бы должна все это выполнять:
PHP:
скопировать код в буфер обмена
  1. function dir_size($d){
  2. $dh = opendir( $d );
  3. $size = 0;
  4. while( ( $f = readdir( $dh ) ) !== false )
  5. {
  6. if ( $f != "." && $f != ".." )
  7.  {
  8.   $path = $d . "/" . $f;
  9.    if( is_dir( $path ) )
  10.      {  $size += dir_size( $path );  }
  11.          elseif( is_file( $path ) )
  12.             {  $size += sprintf("%u", filesize($path));  }
  13.             }
  14.         }
  15.  closedir($dh);
  16.  $fileSize = round( $size / 1024 , 2 );
  17. return $fileSize;
  18. }



Никак не пойму в чем проблема, помогите!

scandir - соберет в массив все пути
а потом условие с is_file
если файл то filesize и складываем
3. anton-logom - 11 Января, 2014 - 10:30:11 - перейти к сообщению
gefard
а разве readdir() обрабатывает только файлы?

Мне кажется, что проблема в вызове рекурсии на том учатске, когда определяется, что файл является директорией.

Сейчас попробую заменить readdir() на scandir() и отпишусь
4. gefard - 11 Января, 2014 - 18:23:58 - перейти к сообщению
anton-logom пишет:
gefard
а разве readdir() обрабатывает только файлы?

Мне кажется, что проблема в вызове рекурсии на том учатске, когда определяется, что файл является директорией.

Сейчас попробую заменить readdir() на scandir() и отпишусь

Вот написал свою, показывает общий размер файлов, количество файлов и количество папок
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php $dir = 'papka/';
  2. $res = scan_dir($dir);
  3. echo 'размер'.$res['size'];
  4. echo '<br>файлов'.$res['files'];
  5. echo '<br>папок'.$res['papok'];
  6. function scan_dir($dir){
  7. $res = array();
  8. $obxod = scandir($dir);
  9. for($i = 2; $i < count($obxod); $i++){
  10. if (is_file($dir.$obxod[$i])) {
  11. $res['size'] += filesize($dir.$obxod[$i]);
  12. $res['files'] += 1;
  13. }
  14. if (is_dir($dir.$obxod[$i])) {
  15. $new_scan = scan_dir($dir.$obxod[$i].'/');
  16. $res['papok'] += 1+$new_scan['papok'];
  17. $res['size'] += $new_scan['size'];
  18. $res['files'] += $new_scan['files'];
  19. }
  20. }
  21. return $res;
  22. }
  23. ?>
5. anton-logom - 13 Января, 2014 - 14:42:17 - перейти к сообщению
gefard спасибо помогло!

 

Powered by ExBB FM 1.0 RC1