FolderCopy, kopieren eines Verzeichnisbaumes

Direkt zum Seiteninhalt

FolderCopy, kopieren eines Verzeichnisbaumes

LISP-Programmierung für AutoCAD und BricsCAD
Veröffentlicht von Jörn Bosse in LISP-Codes · 23 Dezember 2008

Beginnend bei einem Quellverzeichnispfad sollen alle Dateien und Unterverzeichnisse in ein Zielverzeichnis kopiert werden. Die folgenden Codes sind in ähnlicher Form bereits im CAD.de-Beitrag https://ww3.cad.de/foren/ubb/Forum145/HTML/002106.shtml diskutiert worden.

Grundsätzlich würde man bei manueller Vorgehensweise wie folgt vorgehen:
Alle gefundenen Dateien im Quellverzeichnis würden mit Pfadangabe in eine Liste geschrieben werden.
Alle gefundenen Unterverzeichnisse müssten wiederum auf Dateien und Unterverzeichnisse geprüft werden.
Die Punkte 1. und 2. für jedes gefundene Unterverzeichnis solange wiederholen, bis kein Unterverzeichnis mehr gefunden wird, mühsam.

Daher ist es sinnvoll eine rekursive Funktion für die Suche der Dateien und Unterverzeichnisse zu erstellen. Diese ruft sich solange selbst auf, bis kein Unterverzeichnis mehr gefunden wird.
(defun JB_FolderCopy:Search (FolderFileListe SourcePath / A B Files)
;;;wenn Dateien im Quellverzeichnis
(if (setq Files (vl-directory-files SourcePath nil 1))
;;;dann FolderFileListe mit (Flag = 'T; [Quellpfad]+[Dateinamen])
(mapcar
'(lambda (A) (setq FolderFileListe (cons (list 'T (strcat SourcePath A))
FolderFileListe)))
(vl-directory-files SourcePath nil 1)
)
)
;;;FolderFileListe mit (Flag = nil; [Quellpfad])
(setq FolderFileListe (cons (list nil SourcePath) FolderFileListe))
;;;rekursiver Aufruf der Funktion "JB_FolderCopy:Search" für jedes
;;;gefundene Unterverzeichnis
(mapcar '(lambda (A)
(setq FolderFileListe (JB_FolderCopy:Search FolderFileListe
(strcat SourcePath A "\")))
)
(vl-remove-if '(lambda (B) (member B '("." "..")))
(vl-directory-files SourcePath nil -1))
)
;;;Rückgabe der gefundenen Dateien und Unterverzeichnisse
FolderFileListe
)

Als Argumente werden der Funktion JB_FolderCopy:Search eine (anfangs) leere Liste FolderFileListe mit bereits gefundenen
Datei- und Verzeichnispfaden und der jeweils aktuelle Quellpfad SourcePath übergeben.
Der Quellpfad SourcePath bildet sich bei jedem Aufruf aus dem alten Quellverzeichnis + das aktuell gefundene Unterverzeichnis.
Zurückgegeben wird die jeweils aktuelle Liste FolderFileListe.

Innerhalb der Funktion JB_FolderCopy:Search werden die gefundenen Unterverzeichnisse in einer MAPCAR-Schleife abgearbeitet. D.h., die Funtion ruft sich pro MAPCAR-Schleifendurchlauf immer selber auf. Daraus folgt wiederum, daß mehrere MAPCAR-Schleifen zur gleichen Zeit laufen.
Das folgende Bild soll dieses verdeutlichen: FolderCopyTree

Wenn man die MAPCAR-Schleifen nummeriert, beginnend bei 1, würden folgende MAPCAR-Schleifen laufen:
1 (erste Schleife)
1.1 (erste Schleife innerhalb erster Schleife)
1.1.1 (erste Schleife innerhalb erster Schleife innerhalb erster Schleife)
1.1.2 (zweite Schleife innerhalb erster Schleife innerhalb erster Schleife)
1.1.2.1 (erste Schleife …)
1.1.2.2
1.2
1.2.1
1.2.2
1.2.2.1
1.2.2.2
2
Als Rückgabe erhält man folgende Liste:

Mit dieser Liste ist es jetzt ein einfaches, anhand der Flags nil oder ‘T zu unterscheiden, ob es sich um ein Verzeichnis oder einen Dateipfad handelt. Mit den Funktion vl-mkdir werden die Unterverzeichnisse im Zielpfad erstellt, dann können die Dateien mit der Funktion vl-file-copy in die neuen Verzeichnisse kopiert werden.



0
Rezensionen

Zurück zum Seiteninhalt