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]   

> Описание: Функция выводит неверный размер.
Ley4ik_Russia
Отправлено: 12 Апреля, 2011 - 17:07:18
Post Id



Гость


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


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




Представленную ниже функцию использую для получения размера директории, под Windows, но для некоторых папок она выводит отрицательное значение, думал просто домножать значение на " -1", но в итоге оказалось что сам размер очень сильно отличается от реального. Пробовал другие функции проблема такая же...подскажите?))
Спойлер (Отобразить)

При этом размер других директорий она выводит абсолютно правильно!!! я в замешательстве Радость

(Отредактировано автором: 12 Апреля, 2011 - 17:08:40)



-----
Ubuntu Server 12.04.2 LTS, Apache2, PHP5, MySQL5
 
 Top
EuGen Администратор
Отправлено: 12 Апреля, 2011 - 17:14:07
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Возможно, это -
Поскольку PHP использует знаковое представления для чисел целого типа, а многие платформы используют 32-битные целые числа, функция filesize() может возвращать неожиданные значения для файлов, чей размер превосходит 2 Гб. Если размер файла находится в пределах 2 - 4 Гб, корректное значение можно получить, используя конструкцию sprintf("%u", filesize($file)).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Апреля, 2011 - 17:15:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




filesize оперирует значением типа int, притом, знаковым -> предел 2гб.
И суммарная ваша переменная $size наследует это ограничение.

Если устраивает предельное значение размера файла в 2гб, то просто объявите $size как float. Либо переводите в килобайты сразу filesize, перед суммированием.


-----
PostgreSQL DBA
 
 Top
Ley4ik_Russia
Отправлено: 12 Апреля, 2011 - 17:16:05
Post Id



Гость


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


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




EuGen пишет:
Поскольку PHP использует знаковое представления для чисел целого типа, а многие платформы используют 32-битные целые числа, функция filesize() может возвращать неожиданные значения для файлов, чей размер превосходит 2 Гб. Если размер файла находится в пределах 2 - 4 Гб, корректное значение можно получить, используя конструкцию sprintf("%u", filesize($file)).


О...точно в этих директориях присутствуют файлы более 2 Гб...тогда как переделать имеющуюся функцию? Однако


-----
Ubuntu Server 12.04.2 LTS, Apache2, PHP5, MySQL5
 
 Top
EuGen Администратор
Отправлено: 12 Апреля, 2011 - 17:17:50
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ley4ik_Russia
Отправлено: 12 Апреля, 2011 - 17:19:32
Post Id



Гость


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


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




я уже понял после того как спросил)))) спасибо!!


-----
Ubuntu Server 12.04.2 LTS, Apache2, PHP5, MySQL5
 
 Top
dm-grig
Отправлено: 07 Мая, 2012 - 15:34:38
Post Id


Новичок


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


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




Хм Здесь логическая ошибка. При рекурсивном вызове dir_size() размер папки обнуляется
 
 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