2013-02-12 7 views
7

だが、私はClojureの中に次のディレクトリ構造を作成する必要がありましょう:Clojureのは、ディレクトリ階層を作成する - ではなく、手続きの方法で

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

の代わりに、以下のような手続きをやって:

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

...何とか1が一挙に階層を作成し、その後宣言データ、上記のようなアクションを表現し、する巧妙な方法は何ですか?

+0

'make-parents'が役に立つかもしれませんhttps://clojuredocs.org/clojure.java.io/make-parents – xhh

答えて

8

迅速かつ簡単な方法は、それまでにMKDIRを作成し、マッピングするためのdirsのベクトルを作るために次のようになります。

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

たり、ツリーとしてあなたのディレクトリ構造を指定して作る、それを歩いてジッパーを使用することができます途中のdirs:

(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 

多くの一般的なシステム管理を行っている場合は、より重いものが順番になる場合があります。 (それが曇ったものの方に傾く傾向があるが)pallet projectは、ホストされた物理的およびクラウドシステム上のすべての種類のシステム管理を行うためのライブラリです。具体的には

+2

' map'が怠けられることによって発生する可能性のある問題について言及することをお勧めします。 – ponzao

+2

は常に、あなたが各 'mkdir'の結果を気にしないので、怠惰な-バグを回避するために、代わりに' map'の 'doseq'を使用することができます –

+2

怠惰な、バグのために見て!行います。 – bfontaine

関連する問題