使用clojure递归复制目录的全部内容

时间:2015-08-20 06:33:25

标签: clojure

我希望使用clojure模仿cp -R。是否有一种惯用的方式来编写这个函数,以便递归地复制目录的全部内容?

1 个答案:

答案 0 :(得分:0)

(鉴于对此答案仍然有兴趣):

一个人可以将Java java.io.File与clojure的file-seq一起使用:

(require '[clojure.java.io :as io])

(->> "/path"
     (io/file)
     (file-seq)
     (run! (your-fn-that-copies-files-and-creates-folders)))

file-seq将为您的文件/文件夹返回tree-like structure

为了从根源开始保持一致的目录结构,我们必须采取绝对路径并将其转换为相对路径:

(require '[clojure.string :as str]
         '[clojure.data :as data])

(defn- path->chunks [file] (str/split (.getAbsolutePath file) #"/"))
(defn  path->relative [root file]
    (str/join "/" (filter some? (second (data/diff (path->chunks root)
                                                   (path->chunks file))))))

您可以结合所有这些来执行递归副本。