Задача: Подсчет размера директории
Описание
Напишите функцию, которая вычисляет общий размер всех файлов в заданной директории, включая все поддиректории. Задача решается с использованием рекурсивного обхода дерева директорий.
Требования:
Класс
Directory
: Создайте классDirectory
для представления узла в дереве директорий. Каждый узел должен содержать:name
: (строка) Имя директории или файла.size
: (целое число, по умолчанию 0) Размер файла в байтах. Для директорий значение по умолчанию 0, для файлов указывается размер.is_file
: (булево, по умолчаниюFalse
) Флаг, указывающий, является ли узел файлом (True) или директорией (False).children
: (список) Список дочерних узлов (Directory
).
Метод
add_child(self, child)
: Добавляет дочерний узел (child
, объект классаDirectory
) к текущему узлу.- Метод
calculate_total_size(self)
:- Это рекурсивный метод, который вычисляет общий размер всех файлов в поддереве, начиная с текущего узла.
- Пошаговый принцип работы:
- Если текущий узел является файлом, метод возвращает его размер.
- Если текущий узел является директорией, метод инициализирует переменную
total_size
с нулевым значением. - Для каждого дочернего узла (child) вызывается метод
calculate_total_size
(внутри метода вызывается этот же метод - т.е. рекурсивно), и его результат добавляется кtotal_size
. - Метод возвращает значение
total_size
.
- Таким образом, метод сначала собирает размеры файлов в текущей папке, затем вызывает себя для всех поддиректорий, суммирует их и возвращает общий размер. То есть он работает как подсчет в несколько этапов, суммируя результаты каждого вызова.
Пример использования
# Создаем папку rootroot = Directory('root')
# Добавим файл в папку root
file1 = Directory('file1.txt', size=50, is_file=True)
root.add_child(file1)
# Создаем две подпапки documents и pictures
documents = Directory('documents')
root.add_child(documents)
pictures = Directory('pictures')
root.add_child(pictures)
# Добавляем файлы в подпапки documents и pictures
file2 = Directory('file2.txt', size=100, is_file=True)
documents.add_child(file2)
file3 = Directory('file3.jpg', size=200, is_file=True)
pictures.add_child(file3)
# Выводим размер всех файлов в папке root (Учитывая файлы в подпапках)
print(f"{root.calculate_total_size()} байт") # Вывод: 350 байт
Примечание
Для реализации рекурсивной функции необходимо определить базовый случай, который останавливает рекурсивные вызовы, и рекурсивный шаг, который разбиение задачи на меньшие подзадачи и рекурсивный вызов функции для их решения.
В этой задаче, базовый случай рекурсивной функции calculate_total_size
наступает, когда встречается узел, представляющий файл. В этом случае рекурсия прекращается, и функция возвращает размер файла. Если узел представляет собой директорию, запускается рекурсивный шаг, который обрабатывает дочерние элементы, пока не будут достигнуты все файлы – базовые случаи рекурсии.
Характеристики решённой задачи
Список файлов
