import os import shutil # --- Hier die Pfade definieren --- QUELL_ORDNER = input("Quellordner: ") ZIEL_ORDNER = input("Zielordner: ") # --------------------------------- def hole_datei_infos(verzeichnis): """Sammelt alle Dateien mit ihrer Größe und dem Änderungsdatum.""" datei_infos = {} if not os.path.exists(verzeichnis): return datei_infos for ordner_pfad, _, dateien in os.walk(verzeichnis): for datei in dateien: voller_pfad = os.path.join(ordner_pfad, datei) # Relativen Pfad ermitteln (z. B. "unterordner\dokument.docx") relativer_pfad = os.path.relpath(voller_pfad, verzeichnis) try: stat = os.stat(voller_pfad) datei_infos[relativer_pfad] = { "groesse": stat.st_size, "aenderungsdatum": stat.st_mtime, } except Exception: pass return datei_infos def main(): print("=" * 50) print(" USB-STICK SYNCHRONISATION") print("=" * 50) # Prüfen, ob Laufwerke da sind if not os.path.exists(QUELL_ORDNER): print(f"Fehler: Das Schul-Laufwerk ({QUELL_ORDNER}) ist nicht erreichbar!") input("\nDrücke Enter zum Beenden...") return ziel_laufwerk = os.path.splitdrive(ZIEL_ORDNER)[0] + "\\" if not os.path.exists(ziel_laufwerk): print( f"Fehler: Laufwerk {ziel_laufwerk} nicht gefunden. Ist der USB-Stick eingesteckt?" ) input("\nDrücke Enter zum Beenden...") return print("Analysiere Dateien. Bitte warten...\n") quelle = hole_datei_infos(QUELL_ORDNER) ziel = hole_datei_infos(ZIEL_ORDNER) neu = [] geaendert = [] geloescht = [] # Prüfen, was auf P: neu oder geändert wurde for pfad, info in quelle.items(): if pfad not in ziel: neu.append(pfad) else: # Wir prüfen die Dateigröße und das Datum (2 Sekunden Toleranz für USB-Sticks) if ( info["groesse"] != ziel[pfad]["groesse"] or abs(info["aenderungsdatum"] - ziel[pfad]["aenderungsdatum"]) > 2 ): geaendert.append(pfad) # Prüfen, was von P: gelöscht wurde und auf dem Stick auch weg kann for pfad in ziel: if pfad not in quelle: geloescht.append(pfad) # Wenn alles aktuell ist if not neu and not geaendert and not geloescht: print( "Alles ist bereits auf dem neuesten Stand! Keine Änderungen erforderlich." ) input("\nDrücke Enter zum Beenden...") return # Übersicht ausgeben print("Folgende Änderungen wurden gefunden:\n") if neu: print("NEUE DATEIEN (werden auf den Stick kopiert):") for d in neu: print(f" + {d}") print() if geaendert: print("GEÄNDERTE DATEIEN (Inhalt hat sich geändert, werden aktualisiert):") for d in geaendert: print(f" ~ {d}") print() if geloescht: print("GELÖSCHTE DATEIEN (sind nicht mehr auf dem Schul-Laufwerk):") for d in geloescht: print(f" - {d}") print() # --- SCHRITT 1: KOPIEREN & AKTUALISIEREN --- if neu or geaendert: antwort_kopieren = ( input("Sollen die NEUEN und GEÄNDERTEN Dateien kopiert werden? (ja/nein): ") .strip() .lower() ) if antwort_kopieren in ["ja", "j", "yes", "y"]: print("\nKopiere Dateien...") for pfad in neu + geaendert: quell_pfad = os.path.join(QUELL_ORDNER, pfad) ziel_pfad = os.path.join(ZIEL_ORDNER, pfad) # Ordnerstruktur auf dem Stick erstellen, falls ein neuer Unterordner da ist os.makedirs(os.path.dirname(ziel_pfad), exist_ok=True) # Datei kopieren shutil.copy2(quell_pfad, ziel_pfad) print(f"Erfolgreich kopiert: {pfad}") else: print("\nKopieren übersprungen.") # --- SCHRITT 2: LÖSCHEN --- if geloescht: print("\n" + "!" * 55) print(" ACHTUNG: Einige Dateien existieren nur auf dem Stick.") print("!" * 55) antwort_loeschen = ( input( "Sollen die GELÖSCHTEN Dateien nun auch vom Stick ENTFERNT werden? (ja/nein): " ) .strip() .lower() ) if antwort_loeschen in ["ja", "j", "yes", "y"]: print("\nLösche Dateien...") for pfad in geloescht: ziel_pfad = os.path.join(ZIEL_ORDNER, pfad) try: os.remove(ziel_pfad) print(f"Erfolgreich gelöscht: {pfad}") except Exception as e: print(f"Fehler beim Löschen von {pfad}: {e}") else: print( "\nLöschen übersprungen. Die Dateien bleiben als Backup auf dem Stick erhalten." ) print("\nSynchronisation abgeschlossen!") input("\nDrücke Enter zum Beenden...") if __name__ == "__main__": main()