|
|
|
| Ответ 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("Всего директорий — ".$dir_sum.";<br />");
$file_sum = (isset($file_arr)) ? ($GLOBALS['f_count'] + count($file_arr)) : $GLOBALS['f_count'];
echo("Всего файлов — ".$file_sum.";<br />");
$sum = 0;
$sum += (isset($dir_arr)) ? array_sum($dir_arr) : 0;
$sum += (isset($file_arr)) ? array_sum($file_arr) : 0;
echo("Общий объём папки — ".$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 | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|