Init
This commit is contained in:
commit
b21bbfff71
4 changed files with 346 additions and 0 deletions
157
DataPuller.py
Executable file
157
DataPuller.py
Executable file
|
|
@ -0,0 +1,157 @@
|
|||
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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue