Задача понятна. Ниже представлен подробный план и готовый пример кода на Python для "объекта" (класса), который находит и стирает ненужные файлы на компьютере. Я дам безопасный режим (перемещение в корзину/мусор) и режим полного удаления, а также объясню, как адаптировать под любые параметры.
Цель и общий подход
- Что мы хотим: объект/класс, который может сканировать файловую систему, выбирать файлы по заданным критериям и удалять их.
- Безопасный подход: по умолчанию используем перемещение в Trash/Корзину, чтобы можно вернуть файлы, если что-то пошло не так.
- Гибкость: можно задать расширения файлов, возраст, размер, исключения по директориям и режим удаления.
План действий (пошагово)
- Определить критерии отбора файлов:
- Расширения (например, .tmp, .log, .bak)
- Возраст файла (например, старше 30 дней)
- Размер файла (меньше/больше заданного порога)
- Исключения по путям/директориям (чтобы не трогать системные папки)
- Спроектировать класс FileEraser (объект удаления):
- Атрибуты: корневая папка, список расширений, диапазон возраста, диапазон размеров, режим удаления, флаг dry_run, список исключений, логирование.
- Методы: scan (поиск кандидатов), _is_candidate (проверка файла по критериям), delete_all (удаление/перемещение), delete_path (один файл), возможно dry-run вывод.
- Реализация безопасного поведения:
- dry_run по умолчанию, чтобы показывать список без удаления.
- возможность вывода лога, чтобы отслеживать, что удалено.
- опционально использование trash-библиотеки (send2trash) для безопасного удаления в корзину.
- Пример использования:
- Указать корень сканирования, критерии, запустить сканирование, просмотреть найденные файлы, затем подтвердить удаление.
Псевдocode (для понимания алгоритма)
- Scan(root_dir): for каждый файл в дереве директорий: если путь не исключён и файл соответствует критериям: добавить в список кандидатов
- Delete_all(candidates, dry_run): для каждого файла в кандидаты: если dry_run: показать, что удалим иначе: удалить файл (в корзину или навсегда)
- Delete_path(file, mode): если mode == "trash": отправить в корзину иначе: удалить немедленно
Реализация на Python (готовый ориентировочный пример) Примечания:
- Устанавливаем зависимость для безопасного удаления: pip install send2trash
- Режимы: "trash" (перемещать в корзину) или "delete" (удаление без корзины)
- По умолчанию работает как dry_run, чтобы можно было увидеть список без удаления
Код (читать и копировать по мере необходимости)
Импорт нужных модулей
import os import time from pathlib import Path import logging
Популярная безопасная отправка файлов в корзину
try: from send2trash import send2trash except Exception: send2trash = None
class FileEraser: def init( self, root, include_ext=None, # списком расширения, например ['.tmp', '.log'] exclude_dirs=None, # список путей, которые не трогаем age_days=None, # удалить файлы старше N дней min_size=None, # минимальный размер в байтах max_size=None, # максимальный размер в байтах mode='trash', # 'trash' или 'delete' dry_run=True, # без удаления, только вывод кандидатов log_path=None # путь к лог-файлу ): self.root = Path(root) self.include_ext = set(x.lower() for x in include_ext) if include_ext else None self.exclude_dirs = set(Path(p) for p in (exclude_dirs or [])) self.age_days = age_days self.min_size = min_size self.max_size = max_size self.mode = mode self.dry_run = dry_run self.candidates = []
# Настройка логирования
self.logger = logging.getLogger('FileEraser')
self.logger.setLevel(logging.INFO)
if log_path:
handler = logging.FileHandler(log_path)
else:
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter)
if not self.logger.handlers:
self.logger.addHandler(handler)
# Приватный метод: проверить, находится ли путь внутри исключённых директорий
def _is_excluded(self, path: Path) -> bool:
for ex in self.exclude_dirs:
if ex in path.parents or ex in path.parents:
return True
return False
# Приватный метод: подходит ли файл под критерии
def _is_candidate(self, path: Path) -> bool:
if not path.is_file():
return False
if self.include_ext:
if path.suffix.lower() not in self.include_ext:
return False
if self.age_days is not None:
mtime = path.stat().st_mtime
cutoff = time.time() - (self.age_days * 86400)
if mtime > cutoff:
return False
if self.min_size is not None:
if path.stat().st_size < self.min_size:
return False
if self.max_size is not None:
if path.stat().st_size > self.max_size:
return False
return True
# Основной метод: собрать кандидатов
def scan(self):
self.candidates = []
for root, dirs, files in os.walk(self.root):
current = Path(root)
# Пропустить если текущая директория в исключениях
if self._is_excluded(current):
continue
for name in files:
path = current / name
if self._is_candidate(path):
self.candidates.append(path)
self.logger.info("Found %d candidate(s).", len(self.candidates))
return self.candidates
# Удаление одного пути
def delete_path(self, path: Path):
try:
if self.mode == 'trash' and send2trash:
send2trash(str(path))
else:
path.unlink()
self.logger.info("Deleted: %s", path)
except Exception as e:
self.logger.error("Failed to delete %s: %s", path, e)
# Удаление всех найденных кандидатов
def delete_all(self, dry_run=None):
if dry_run is None:
dry_run = self.dry_run
for p in self.candidates:
if dry_run:
print("[DRY-RUN] Would delete:", p)
else:
self.delete_path(p)
Пример использования
if name == 'main': # Пример параметров: удаляем устаревшие *.tmp, *.log старше 30 дней eraser = FileEraser( root=r'C:\Users\Student\Downloads', # корневая папка для сканирования include_ext=['.tmp', '.log', '.bak'], # какие расширения удаляем age_days=30, # файлы старше 30 дней mode='trash', # сохранить в корзину dry_run=True, # режим безопасного просмотра exclude_dirs=[r'C:\Windows', r'C:\Program Files'] # исключения )
candidates = eraser.scan()
# Потребитель может просмотреть список перед удалением
for c in candidates:
print(c)
input("Press Enter to выполнить удаление (в безопасном режиме DRY-RUN): ")
eraser.delete_all(dry_run=False)
Пояснения к коду
- Что делает класс:
- init: настраивает параметры сканирования и режим удаления.
- scan: обходит дерево каталогов, собирает файлы, удовлетворяющие критериям (расширение, возраст, размер).
- _is_candidate: проверяет файл по всем критериям.
- delete_all: удаляет все найденные файлы. Если режим dry_run или параметр dry_run установлен, просто выводит какие файлы бы удалились.
- delete_path: удаление одного файла. В режиме trash используется send2trash, чтобы отправить файл в корзину; иначе файл удаляется напрямую (permanent delete).
Как адаптировать под ваши параметры
- Не указывайте include_ext — будут учитываться файлы любого расширения.
- Укажите exclude_dirs, чтобы не трогать системные папки или важные директории.
- age_days задаёт порог возраста. 0 или None означает не учитывать возраст.
- min_size и max_size позволяют задать диапазон размера файла в байтах.
- mode может быть 'trash' (рекомендовано) или 'delete' (удаление навсегда).
- dry_run по умолчанию помогает сначала увидеть, что именно будет удалено.
Безопасность и рекомендуемые практики
- Всегда начинайте с dry_run, чтобы избежать случайной потери данных.
- Сохраняйте логи удалений (log_path или вывод в консоль).
- По возможности используйте режим trash, чтобы можно было вернуть файлы из корзины.
- Делайте резервные копии важных данных перед массовым удалением.
Если хотите, могу адаптировать код под ваш класс/уровень знаний или перевести на другой язык программирования (например, PowerShell для Windows или Bash для Linux). Также могу подготовить вариант без использования внешних библиотек (исключить send2trash) для полного удаления навсегда.