О проекте
Десктопное приложение на Python с графическим интерфейсом для копирования файлов и папок между каталогами с гибкой системой фильтрации (игнорирование папок и файлов по имени), подсчётом статистики, индикатором прогресса и сохранением настроек в JSON.
Кроссплатформенное десктоп-приложение для резервного копирования и переноса файлов между каталогами с возможностью исключать ненужные папки и файлы по имени. Особенно удобно для копирования проектов программирования — приложение позволяет одним кликом исключить служебные директории (`__pycache__`, `.venv`, `.git`, `alembic` и т.п.) и скопировать только чистые исходники.
Реализован полноценный графический интерфейс на Tkinter с разделением логики, многопоточным копированием (интерфейс не блокируется), детальной статистикой в реальном времени и возможностью сохранять настройки фильтрации между сессиями.
Стек и ссылки
Статус: Завершён
Задача
Разработать удобный инструмент для копирования файлов и папок между каталогами с возможностью гибкого исключения служебных директорий и файлов. Инструмент должен:
- иметь простой графический интерфейс для выбора источника и назначения;
- поддерживать настраиваемый список игнорируемых папок и файлов с сохранением между запусками;
- показывать прогресс копирования и подробную статистику (количество и объём файлов);
- не блокировать интерфейс во время работы (фоновое копирование);
- корректно работать с вложенными директориями и большими объёмами данных.
Решение
Реализовано десктопное приложение на Python 3 с графическим интерфейсом на Tkinter.
**Архитектура и интерфейс:**
- Разделение на UI (Tkinter), логику копирования и работу с настройками.
- Поля для выбора папки-источника и папки-назначения с системными диалогами выбора директорий.
- Отдельное окно настройки игнорирования: два текстовых поля — для папок и для файлов — по одному имени на строку.
- Прогресс-бар, статусная строка и прокручиваемое поле статистики.
- Кнопка запуска с подтверждающим диалогом (показывает, откуда, куда и что игнорируется).
**Логика копирования:**
- Двухпроходный алгоритм: сначала подсчёт общего количества файлов и объёма, затем само копирование — это нужно для корректного расчёта процента прогресса.
- Копирование выполняется в отдельном потоке (`threading.Thread`), интерфейс остаётся отзывчивым.
- Обход дерева каталогов через `os.walk()` с фильтрацией на уровне списка `dirs` — игнорируемые папки не обходятся вообще.
- `shutil.copy2()` для сохранения метаданных (время изменения, права доступа).
- Обработка ошибок копирования по каждому файлу отдельно — один сбойный файл не останавливает процесс.
- Проверка непустой папки назначения перед началом — с подтверждением перезаписи.
**Настройки:**
- Списки игнорируемых папок и файлов хранятся в `copy_settings.json` в формате JSON с поддержкой кириллицы (`ensure_ascii=False`).
- Настройки загружаются при старте и сохраняются по кнопке.
- Значения по умолчанию включают типичные служебные директории Python-проектов.
**Статистика:**
- В реальном времени: количество скопированных файлов из общего, объём в читаемом формате (B, KB, MB, GB), имя текущего файла.
- По завершении: итоговое количество файлов, общий объём, процент успешности.
Результаты
Рабочее десктоп-приложение, полностью закрывающее задачу чистого копирования проектов. Удобный интерфейс, отзывчивый даже при работе с большими объёмами, подробная статистика и гибкая фильтрация. Настройки сохраняются между запусками — при повторном использовании не нужно вводить список игнорирования заново. Приложение готово к использованию на Windows, Linux и macOS (Tkinter входит в стандартную библиотеку Python).
Мой вклад
Единоличная разработка полного цикла: проектирование архитектуры, реализация графического интерфейса на Tkinter, логика многопоточного копирования, система фильтрации, работа с JSON-настройками, обработка ошибок, формирование статистики. Тестирование на реальных проектах с разными структурами каталогов.