用clojure压缩文件

用clojure压缩文件,clojure,zip,Clojure,Zip,我想在clojure中压缩一个文件,但找不到任何库来压缩 你知道在Clojure中压缩文件或文件夹的好方法吗? 我必须使用java库吗?java中有一个库存ZipOutputStream,可以从Clojure使用。我不知道某处是否有图书馆。我将普通Java函数与一个小的helper宏一起使用: (defmacro ^:private with-entry [zip entry-name & body] `(let [^ZipOutputStream zip# ~zip]

我想在clojure中压缩一个文件,但找不到任何库来压缩

你知道在Clojure中压缩文件或文件夹的好方法吗?
我必须使用java库吗?

java中有一个库存
ZipOutputStream
,可以从Clojure使用。我不知道某处是否有图书馆。我将普通Java函数与一个小的helper宏一起使用:

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

所有文件的压缩和解压缩都可以通过一个简单的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")
您可以导入此(gzip) 这很有趣。 或者更准确地说,你可以用这个

(defn gzip    
[input output & opts]
(with-open [output (-> output clojure.java.io/output-stream GZIPOutputStream.)]
 (with-open [rdr (clojure.java.io/reader input)]
  (doall (apply clojure.java.io/copy rdr output opts)))))
只需一个命令,就可以使用包装和压缩的库

添加库依赖项[rtcritical/clj ant tasks“1.0.1”]

要压缩文件,请执行以下操作:

(run-ant-task :zip {:destfile "/tmp/file-zipped.zip" 
                    :basedir "/tmp"
                    :includes "file-to-zip"})
注意:此库命名空间中的run ant task函数也可用于运行任何其他任务


有关更多信息,请参见

只是好奇,为什么不想使用Java库?使用现有的Javalibs是clojure和其他基于JVM的语言的最大USP之一。为什么要重新发明轮子?我想用现有的图书馆。。。我不明白你的答案。也许我的英语不好。。。什么是USP?@jeremieca谢谢!ZipoutStream的导入是:
(:import[java.util.zip ZipoutStream])
。或者只是
(:import java.util.zip.ZipoutStream)
。是的。。。因为我忘了ZipEntry:
(:import[java.util.zip ZipEntry ZipoutStream])
(run-ant-task :zip {:destfile "/tmp/file-zipped.zip" 
                    :basedir "/tmp"
                    :includes "file-to-zip"})