2013-02-12 6 views
7

Sagen wir, ich brauche die folgende Verzeichnisstruktur in Clojure zu erstellen:Clojure Verzeichnishierarchie erstellen - aber nicht in einer prozeduralen Weise

a 
\--b 
| \--b1 
| \--b2 
\--c 
    \-c1 

Statt tun Verfahrens Dinge wie die folgenden:

(def a (File. "a")) 
(.mkdir a) 
(def b (File. a "b")) 
(.mkdir b) 
;; ... 

... gibt es eine clevere Möglichkeit, die obigen Aktionen als Daten deklarativ darzustellen und dann die Hierarchie auf einen Schlag zu erstellen?

+0

'make-Eltern' könnte hilfreich sein https://clojuredocs.org/clojure.java.io/make-parents – xhh

Antwort

8

ein schneller und einfacher Ansatz wäre, einen Vektor von dirs auf, um es zu schaffen und Karte mkdir zu machen:

user> (map #(.mkdir (java.io.File. %)) ["a", "a/b" "a/b/c"]) 
(true true true) 

oder Sie Ihre dir Struktur als Baum angeben und Reißverschluss es zu Fuß nutzen machen die Richtungen auf dem Weg:

(def dirs ["a" ["b" ["b1" "b2"]] ["c" ["c1"]]]) 
(defn make-dir-tree [original] 
    (loop [loc (zip/vector-zip original)] 
    (if (zip/end? loc) 
     (zip/root loc) 
     (recur (zip/next 
       (do (if (not (vector? (zip/node loc))) 
        (let [path (apply str (interpose "/" (butlast (map first (zip/path loc))))) 
          name (zip/node loc)] 
         (if (empty? path) 
         (.mkdir (java.io.File. name)) 
         (.mkdir (java.io.File. (str path "/" name)))))) 
        loc)))))) 
(make-dir-tree dirs) 

.

Wenn Sie eine Menge allgemeine Systemadministration tun, dann kann etwas schwerer sein. Die pallet project ist eine Bibliothek für Systemadministration aller Art auf physischen und Cloud-gehosteten Systemen (obwohl es neigt sich in Richtung der wolkigen Sachen neigen). Speziell die

+2

Ich empfehle, die möglichen Probleme zu erwähnen, die entstehen, wenn' map' faul ist. – ponzao

+2

werde tun !, immer auf den Lazy-Bug achten –

+2

Sie können 'doseq' anstelle von' map' verwenden, um den Lazy-Bug zu vermeiden, da Sie sich nicht um das Ergebnis jedes 'mkdir' kümmern. – bfontaine

Verwandte Themen