我想在clojure中压缩文件,但我找不到任何库。
你知道在Clojure中压缩文件或文件夹的好方法吗? 我必须使用java库吗?
答案 0 :(得分:13)
Java中有一个库存ZipOutputStream
,可以在Clojure中使用。我不知道某个地方是否有图书馆。我使用带有小助手宏的普通Java函数:
(defmacro ^:private with-entry
[zip entry-name & body]
`(let [^ZipOutputStream zip# ~zip]
(.putNextEntry zip# (ZipEntry. ~entry-name))
~@body
(flush)
(.closeEntry zip#)))
显然,每个ZIP条目都描述了一个文件。
(require '[clojure.java.io :as io])
(with-open [file (io/output-stream "foo.zip")
zip (ZipOutputStream. file)
wrt (io/writer zip)]
(binding [*out* wrt]
(doto zip
(with-entry "foo.txt"
(println "foo"))
(with-entry "bar/baz.txt"
(println "baz")))))
要压缩文件,您可能需要执行以下操作:
(with-open [output (ZipOutputStream. (io/output-stream "foo.zip"))
input (io/input-stream "foo")]
(with-entry output "foo"
(io/copy input output)))
答案 1 :(得分:2)
文件的所有压缩和解压缩都可以使用简单的shell命令完成,我们可以通过clojure.java.shell
使用相同的方法,您还可以压缩和解压缩终端通常的任何压缩类型。
(use '[clojure.java.shell :only [sh]])
(defn unpack-resources [in out]
(clojure.java.shell/sh
"sh" "-c"
(str " unzip " in " -d " out)))
(defn pack-resources [in out]
(clojure.java.shell/sh
"sh" "-c"
(str " zip " in " -r " out)))
(unpack-resources "/path/to/my/zip/foo.zip"
"/path/to/store/unzipped/files")
(pack-resources "/path/to/store/archive/myZipArchiveName.zip"
"/path/to/my/file/myTextFile.csv")
答案 2 :(得分:0)
您可以导入此内容(gzip)https://gist.github.com/bpsm/1858654 它非常有趣。 或者更确切地说,您可以使用此
or strSeat = "pavillion"
答案 3 :(得分:0)
您可以使用包含rtcritical/clj-ant-tasks的Apache Ant库,并使用单个命令进行压缩。
添加库依赖项[rtcritical / clj-ant-tasks“ 1.0.1”]
(require '[rtcritical.clj-ant-tasks :refer [run-ant-task]])
要压缩文件:
(run-ant-task :zip {:destfile "/tmp/file-zipped.zip"
:basedir "/tmp"
:includes "file-to-zip"})
注意:该库名称空间中的run-ant-task(s)函数也可以用于运行任何其他Apache Ant任务。