44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
# core/commands/rm.py
|
|
from core.connection import BuzzerError
|
|
from core.commands.ls import get_file_tree
|
|
|
|
def _delete_recursive(conn, nodes):
|
|
"""Löscht Knoten Bottom-Up (erst Dateien/Unterordner, dann den Ordner selbst)"""
|
|
for node in nodes:
|
|
if node["type"] == 'D':
|
|
if "children" in node and node["children"]:
|
|
_delete_recursive(conn, node["children"])
|
|
_try_rm(conn, node["path"], is_dir=True)
|
|
elif node["type"] == 'F':
|
|
_try_rm(conn, node["path"], is_dir=False)
|
|
|
|
def _try_rm(conn, path, is_dir=False):
|
|
icon = "📁" if is_dir else "📄"
|
|
try:
|
|
conn.send_command(f"rm {path}")
|
|
print(f" 🗑️ {icon} Gelöscht: {path}")
|
|
except BuzzerError as e:
|
|
print(f" ❌ Fehler bei {path}: {e}")
|
|
|
|
def execute(conn, path: str, recursive: bool = False):
|
|
"""Löscht eine Datei oder ein Verzeichnis."""
|
|
if recursive:
|
|
print(f"Sammle Dateibaum für rekursives Löschen von '{path}'...")
|
|
# Lade den kompletten Baum ab diesem Pfad
|
|
tree = get_file_tree(conn, target_path=path, recursive=True)
|
|
|
|
if len(tree) == 1 and tree[0].get("type") == "E":
|
|
print(f"❌ Pfad nicht gefunden oder Fehler: {tree[0]['name']}")
|
|
return
|
|
|
|
if not tree:
|
|
print(f"Ordner '{path}' ist bereits leer.")
|
|
else:
|
|
_delete_recursive(conn, tree)
|
|
|
|
# Am Ende das eigentliche Ziel löschen (die Datei oder den nun leeren Ordner)
|
|
try:
|
|
conn.send_command(f"rm {path}")
|
|
print(f"🗑️ '{path}' erfolgreich gelöscht.")
|
|
except BuzzerError as e:
|
|
print(f"❌ Fehler beim Löschen von '{path}': {e}") |