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

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Ответ 003 на задачу N 8

Сообщения:  [1-2] 

 
 автор: 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 

   
 
 автор: 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

   

Сообщения:  [1-2] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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