2013-02-12 9 views
7

Diciamo che ho bisogno di creare la seguente struttura di directory in Clojure:Clojure creare gerarchia di directory - ma non in modo procedurale

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

Invece di fare le cose procedurali come la seguente:

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

... c'è un modo intelligente per rappresentare in qualche modo le azioni di cui sopra come dati, in modo dichiarativo, e quindi creare la gerarchia in un colpo solo?

+0

'make-parents' potrebbe essere utile https://clojuredocs.org/clojure.java.io/make-parents – xhh

risposta

8

un approccio semplice e veloce sarebbe quella di fare un vettore di dirs per creare e mappa mkdir su di esso:

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

oppure è possibile specificare la struttura dir come un albero e utilizzare cerniere per camminare fare il dirs sul modo:

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

.

[email protected]:~/hello$ find a 
a 
a/c 
a/c/c1 
a/b 
a/b/c 
a/b/b2 
a/b/b1 

Se si sta eseguendo un sacco di amministrazione dei sistemi generali, è possibile che sia necessario qualcosa di più pesante. Il pallet project è una libreria per l'amministrazione di sistema di tutti i tipi su sistemi host fisici e cloud (anche se tende a inclinarsi verso il materiale nuvoloso). Nello specifico il

+2

Raccomando di menzionare i possibili problemi derivanti dal fatto che' map' è pigro. – ponzao

+2

farà !, guarda sempre il bug pigro –

+2

Puoi usare 'doseq' invece di' map' per evitare il bug pigro, dato che non ti interessa il risultato di ogni 'mkdir'. – bfontaine

Problemi correlati