Вступление: Почему я решил написать эту программу?
Знаете это чувство, когда даёшь другу флешку с важными файлами, а он потом говорит: «Ой, я там случайно папку с мемами перезаписал»? Или когда начальник просит скопировать отчёт, а ты потом не помнишь — копировал вообще или просто «подумал и забыл»?
Вот и я с этим столкнулся. А ещё я параноик. Полезный параноик, который умеет программировать на Python.
И теперь я расскажу вам, как написать программу, которая будет контролировать копирование файлов как строгая учительница на контрольной. Ни одна копия не пройдёт незамеченной! 🕵️
Что умеет наша программа?
Спойлер: она умеет всё, кроме... ну, кроме того, чтобы написать себя сама. Пока что.
Наш будущий шедевр будет:
✅ Отслеживать — когда и куда скопировали файл
✅ Проверять — не повредилась ли копия по пути (хеширование, детка!)
✅ Логировать — вести досье на каждую копию
✅ Сигнализировать — если что-то пошло не так
✅ Определять — флешка это или обычный диск (потому что флешки любят «теряться»)
Звучит как программа из «Шпионских игр»? Ага. Но писать будем мы, а не спецагенты.
Шаг 1: Готовим инструменты
Для начала установим нужные библиотеки. Открываем терминал (или командную строку, если вы ещё не перешли на тёмную сторону) и пишем:
bash
pip install psutil watchdog pywin32
Что за звери?
- psutil — крутая штука, которая видит всё про диски и процессы
- watchdog — наблюдает за папками как кошка за лазерной указкой
- pywin32 — только для Windows, помогает отличать флешки от обычных дисков
Пользователи Linux и macOS — не грустите, у вас тоже всё будет работать. Просто чуть-чуть по-другому. Как борщ без свеклы — можно, но не то.
Шаг 2: Пишем ядро системы (и не взорвётся)
Часть 1. Определяем, флешка перед нами или нет
Начнём с магии. Как компьютер понимает, что перед ним флешка, а не, скажем, бутерброд?
import platform
import win32file # если вы на Windows
def is_usb_drive(path):
"""Проверяет, является ли диск USB-накопителем"""
if platform.system() == 'Windows':
drive_letter = path[0].upper()
drive_type = win32file.GetDriveType(f"{drive_letter}:\\")
# 2 = DRIVE_REMOVABLE (съёмный диск)
return drive_type == 2
elif platform.system() == 'Linux':
# Тут код для либосов (шучу, для Linux)
import subprocess
result = subprocess.run(['lsblk', '-o', 'MOUNTPOINT,TYPE'],
capture_output=True, text=True)
return 'usb' in result.stdout.lower()
else:
return False # Может, это вообще не диск, а овсянка, сэр!
Юмористический комментарий: Если программа вернёт True на вопросе «это флешка?», значит, всё ок. Если False — возможно, вы подключили к компьютеру тостер. Но не гарантирую.
Часть 2. Хеширование — наша новая любовь
Что такое хеш? Если просто — это такой цифровой «отпечаток пальца» файла. Чуть-чуть изменил файл — хеш полностью поменялся. Идеально для контроля!
import hashlib
def calculate_hash(file_path):
"""Считаем хеш файла (лениво, но надёжно)"""
sha256 = hashlib.sha256()
try:
with open(file_path, 'rb') as f:
# Читаем кусочками по 8 КБ, чтобы не подавиться
for chunk in iter(lambda: f.read(8192), b''):
sha256.update(chunk)
return sha256.hexdigest()
except Exception as e:
print(f"Ошибка: файл {file_path} не хочет давать свой отпечаток!")
return None
Почему 8192 байта? Потому что красивое число. А если серьёзно — оптимальный размер для чтения. Как ложка для обеда: не маленькая, не большая, а в самый раз.
Часть 3. Копирование с контролем
Самое мясо! Копируем, проверяем, ругаемся, если что-то не так.
import shutil
from pathlib import Path
def smart_copy(source, destination):
"""Копирует файл, но с проверкой, что всё честно"""
source_path = Path(source)
# Если destination — папка, добавляем имя файла
if Path(destination).is_dir():
dest_path = Path(destination) / source_path.name
else:
dest_path = Path(destination)
# Получаем "отпечаток" исходника
source_hash = calculate_hash(source)
if not source_hash:
return False, "Не могу прочитать исходный файл (может, он привидение?)"
# Копируем
try:
shutil.copy2(source, dest_path)
except Exception as e:
return False, f"Ошибка копирования: {e}"
# Проверяем копию
dest_hash = calculate_hash(dest_path)
if source_hash == dest_hash:
return True, "Файл скопирован и проверен!"
else:
return False, "Тревога! Файл повреждён при копировании!"
Важное примечание: если функция вернула False — бегите проверять флешку. Возможно, её грызли хомяки.
Часть 4. Логирование — чтобы было что показать начальнику
Согласитесь, без логов программа — как детектив без записной книжки. Мы будем записывать всё в файлик copy_log.json:
import json
from datetime import datetime
def log_copy_event(source, dest, success, message):
"""Логируем всё, что происходит (и немного того, чего не происходит)"""
log_file = "copy_log.json"
event = {
"timestamp": datetime.now().isoformat(),
"source": source,
"destination": dest,
"success": success,
"message": message
}
# Читаем старые логи
try:
with open(log_file, 'r', encoding='utf-8') as f:
logs = json.load(f)
except:
logs = []
# Добавляем новое событие
logs.append(event)
# Сохраняем обратно
with open(log_file, 'w', encoding='utf-8') as f:
json.dump(logs, f, ensure_ascii=False, indent=2)
print(f"[{datetime.now().strftime('%H:%M:%S')}] {message}")
Теперь у вас будет чёрный список файлов, которые не скопировались. Или красный? В общем, список.
Шаг 3: Пишем полноценного шпиона
Соединяем всё вместе и добавляем функцию, которая сама следит за папкой.
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class CopySpy(FileSystemEventHandler):
"""Шпион, который видит всё"""
def on_created(self, event):
if not event.is_directory:
print(f"🔍 Внимание! Появился новый файл: {event.src_path}")
# Тут можно добавить проверку, откуда он взялся
# Но мы пока просто логируем факт появления
def monitor_folder(folder_to_watch):
"""Запускает слежку за папкой (не шпионское ПО, честно)"""
event_handler = CopySpy()
observer = Observer()
observer.schedule(event_handler, folder_to_watch, recursive=True)
observer.start()
print(f"👁️ Начинаем слежку за папкой {folder_to_watch}")
print("Нажмите Ctrl+C, если хотите спать спокойно")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
print("\n😴 Слежка завершена. Можете выдохнуть.")
observer.join()
Шаг 4: Продвинутые фишки для тех, кто хочет в топ
Фишка 1: Отправка уведомлений в Telegram
import requests
def send_telegram_alert(message):
"""Отправляет паник-сообщение в Telegram"""
bot_token = "ВАШ_ТОКЕН_БОТА"
chat_id = "ВАШ_CHAT_ID"
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
data = {"chat_id": chat_id, "text": f"🚨 ОПАСНОСТЬ! {message}"}
try:
requests.post(url, data=data)
except:
pass # Если не отправилось — ну и ладно, не век же вековать
Теперь бот будет писать вам: «Вася, тут файл копируют! Бегом смотреть!» Удобно же?
Фишка 2: Защита от дурака (или от себя)
def confirm_copy(source, dest):
"""Спрашивает разрешение перед копированием"""
answer = input(f"Копировать {source} на {dest}? (да/нет): ")
return answer.lower() in ['да', 'yes', 'lf', 'y'] # На любой вкус
Практический пример: как это всё запустить
def main():
print("=== СУПЕР-КОНТРОЛЛЕР КОПИРОВАНИЯ ФАЙЛОВ v1.0 ===")
print("(Создано бессонными ночами и чашками кофе)\n")
# Выбираем исходный файл
source = input("Введите путь к файлу: ")
# Выбираем папку назначения
dest = input("Введите папку для копирования: ")
# Проверяем, флешка ли это
if is_usb_drive(dest):
print("⚠️ ВНИМАНИЕ! Вы копируете на флешку! Будьте осторожны!")
confirm = input("Продолжить? (да/нет): ")
if confirm.lower() != 'да':
print("Копирование отменено. Флешка спасена!")
return
# Выполняем копирование
success, message = smart_copy(source, dest)
# Логируем результат
log_copy_event(source, dest, success, message)
# Отправляем уведомление
if not success:
send_telegram_alert(f"Ошибка копирования: {message}")
print(f"\nРезультат: {message}")
# Запускаем слежку за папкой, если нужно
monitor = input("\nЗапустить слежку за папкой? (да/нет): ")
if monitor.lower() == 'да':
monitor_folder(dest)
if __name__ == "__main__":
main()
Что в итоге?
Друзья, теперь у вас есть оружие массового поражения для контроля файлов. Вы можете:
✅ Знать, куда и когда копируются ваши файлы
✅ Проверять, не повредилась ли копия
✅ Отслеживать флешки (и ругать коллег, которые их теряют)
✅ Получать уведомления в Telegram
✅ Чувствовать себя хакером из фильмов про кибербезопасность
Честный эпилог
Эта программа не сделает из вас Мистера Робота. Но она сделает жизнь чуточку спокойнее. А ещё — это отличный способ прокачать свой Python и порадовать внутреннего параноика.
P.S. Если программа вдруг не заработает — перепроверьте пути к файлам. В 90% случаев проблема не в коде, а в том, что вы забыли создать папку или перепутали слеши / и \. Знаем, плавали.
P.P.S. А если заработает — поставьте лайк статье. Не за спасибо, а за то, чтобы я и дальше писал такие туториалы с чувством юмора и пользой!
P.P.P.S. Код полностью рабочий, проверено на кошках. Кошкам не понравилось, но файлы скопировались. 🐱