Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 003 на задачу N 8
 
 автор: SoftTime   (20.02.2006 в 20:51)   письмо автору
 
 

Ответ 003 на задачу N 8.
С условиями задачи можно ознакомится по ссылке.
<?php
# size.php к задаче №8

# препарируемая папка
$dir "c:/windows/temp";
# проверка доступности
if ( !file_exists($dir) ) {
  exit(
"Папки не существует!");
} elseif ( !
is_readable($dir) ) {
  exit(
"Невозможно прочитать папку!");
}

# для статистики
$GLOBALS['d_count'] = 0;
$GLOBALS['f_count'] = 0;
# получаем список файлов и папок в массив
$d scandir($dir);
# в цикле определяем размеры всех элементов
foreach ( $d as $file ) {
  
# ...не учитывая родительскую и текущую папки
  
if ( $file !== "." && $file !== ".." ) {
    
# определяем размеры всех файлов и заносим в массив
    
if ( is_file($dir."/".$file) ) {
      
$file_arr[$file] = round((filesize($dir."/".$file) / 1024), 1);
    
# определяем размеры всех директорий и заносим в массив
    
} elseif ( is_dir($dir."/".$file) ) {
      
# ...определяется вызовом ф-ции sub_dirs(), описанной ниже
      
$dir_arr[$file] = round((sub_dirs($dir."/".$file$size) / 1024), 1);
    }
  }
# конец цикла определения размеров всех элементов
# вывод данных на экран в таблице
echo('<table border="1">');
echo(
'<tr><td><b>Папка</b></td><td><b>Размер (Кб)</b></td></tr>');
# в цикле выведем директории и Файлы
if ( isset($dir_arr) ) {
  foreach ( 
$dir_arr as $d_name => $d_size ) {
    echo(
"<tr><td>".$d_name."</td><td>".$d_size."</td></tr>");
  }
}
echo(
'<tr><td><b>Файл</b></td><td><b>Размер (Кб)</b></td></tr>');
if ( isset(
$file_arr) ) {
  foreach ( 
$file_arr as $f_name => $f_size ) {
    echo(
"<tr><td>".$f_name."</td><td>".$f_size."</td></tr>");
  }
}
echo(
"</table>");
# немного статистики
echo("<br />Статистика для папки \"".$dir."\":<br />");
$dir_sum = (isset($dir_arr)) ? ($GLOBALS['d_count'] + count($dir_arr)) : $GLOBALS['d_count'];
echo(
"Всего директорий &mdash; ".$dir_sum.";<br />");
$file_sum = (isset($file_arr)) ? ($GLOBALS['f_count'] + count($file_arr)) : $GLOBALS['f_count'];
echo(
"Всего файлов &mdash; ".$file_sum.";<br />");
$sum 0;
$sum += (isset($dir_arr)) ? array_sum($dir_arr) : 0;
$sum += (isset($file_arr)) ? array_sum($file_arr) : 0;
echo(
"Общий объём папки &mdash; ".$sum." Кб;");

# переменная, в которой хранится размеры текущей папки
$size 0;
# функция подсчёта размеров выбранной директории
function sub_dirs($dir, &$size) {
  
# объявляем псевдо-класс (открытие папки)
  
$d dir($dir);
  
# в цикле читаем содержимое папки
  # примечание: если встретится директория с именем "false",
  # цикл прервётся, поэтому была введена проверка на false
  
while ( false !== ($current $d -> read()) ) {
    
# ...без учёта текущей и родительской папок
    
if ( $current !== "." && $current !== ".." ) {
      
# к переменной прибавляются размеры всех файлов
      
if ( is_file($dir."/".$current) ) {
        
$GLOBALS['f_count']++;
        
$size += filesize($dir."/".$current);
      
# если есть подпапка - рекурсивно вызовем sub_dir() для
      # этой подпапки
      
} elseif ( is_dir($dir."/".$current) ) {
        
$GLOBALS['d_count']++;
        
sub_dirs($dir."/".$current$size);
      }
    }
  } 
# конец цикла чтения содержимого папки
  # закроем директорию
  
$d -> close();
  
# вернём подсчитанные размеры
  
return($size);
# конец функции sub_dirs()
?>


http://www.softtime.ru/info/task.php?id_article=78

   
 
 автор: cheops   (22.02.2006 в 23:02)   письмо автору
 
   для: SoftTime   (20.02.2006 в 20:51)
 

Очень громоздко. Исследования показали, что число ошибок в коде не зависит от задачи, а определяется лишь размером кода и квалификацией программиста. Чем больше код - тем больше вероятность совершить ошибку. Эта длительная приамбула :) к тому, что код работает с ошибкой - которую легко проследить при анализе директории с большим числом поддиректорий. Объём идёт по нарастающей - он выводит не индивидуальный размер каждой из директорий, а суммарный объём включая объём предыдущих директорий - у меня, например, наблюдается монотонный рост, начиная с 48.6 до 122677.8 Кб.
48.6 
531.2 
677.1 
870.3 
965.5 
966 
3026 
3155.7 
3174.6 
3222 
3337.3 
4098.1 
6163.6 
6429.8 
7294.3 
34441.5 
34491.2 
34618.4 
38349.6 
40796.3 
42325.1 
42492.1 
42551.1 
43116.4 
43485.2 
43868.6 
43889.2 
43908.1 
43967.1 
60517.1 
60607.4 
61165.8 
65480.3 
122677.8 

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования