DataPuller/DataPuller.py
2026-03-04 10:06:30 +01:00

157 lines
5.1 KiB
Python
Executable file

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()