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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: как посчитать размер директори?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
anton-logom
Отправлено: 10 Января, 2014 - 18:23:50
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




Здравствуйте, подскажите пожалуйста.
Нужно, чтобы сценарий подсчитывал в кб размер определенной директории (файлы и вложенные в неё директории, если есть).

Использовал такую функцию, которая вроде бы должна все это выполнять:
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. }


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

Никак не пойму в чем проблема, помогите!
 
 Top
gefard
Отправлено: 10 Января, 2014 - 18:54:35
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




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 и складываем

(Отредактировано автором: 10 Января, 2014 - 18:59:12)

 
 Top
anton-logom
Отправлено: 11 Января, 2014 - 10:30:11
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




gefard
а разве readdir() обрабатывает только файлы?

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

Сейчас попробую заменить readdir() на scandir() и отпишусь
 
 Top
gefard
Отправлено: 11 Января, 2014 - 18:23:58
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




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. ?>
 
 Top
anton-logom
Отправлено: 13 Января, 2014 - 14:42:17
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




gefard спасибо помогло!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB