如何使用Clojure递归压缩文件夹

Pet*_*ter 3 java zip clojure

我想用clojure压缩一个文件夹recursevely.这种文件夹的一个例子是

??? a
??? b
?   ??? c
?   ?   ??? ccc.txt
?   ??? bb.txt
??? c
??? a.txt
??? b.txt
Run Code Online (Sandbox Code Playgroud)

选项1:在Clojure中使用操作系统

有什么工作zip在Ubuntu是执行按照本结构的根:

zip -r result.zip *
Run Code Online (Sandbox Code Playgroud)

但是你必须在工作目录中才能做到这一点.使用绝对路径将产生其他结果并且省略所有路径将使结构变得平坦.

问题是你不能改变Clojure中的工作目录,而不是我知道那是..

选项2:使用本机Clojure(或Java)

这应该是可能的,我在Clojure或Java包装器中找到了一些zip实现.但是大部分都是单个文件.

这可能是一个解决方案:http://www.java-forums.org/blogs/java-io/973-how-work-zip-files-java.html

但在我尝试之前,我想现在或者周围没有一个好的Clojure库.

Kyl*_*yle 8

使用clojure.core/file-seq这样的事情怎么样?

(require '[clojure.java.io :as io])
(import '[java.util.zip ZipEntry ZipOutputStream])

(with-open [zip (ZipOutputStream. (io/output-stream "foo.zip"))]
  (doseq [f (file-seq (io/file "/path/to/directory")) :when (.isFile f)]
    (.putNextEntry zip (ZipEntry. (.getPath f)))
    (io/copy f zip)
    (.closeEntry zip)))
Run Code Online (Sandbox Code Playgroud)