7

我想在 clojure 中压缩文件,但找不到任何库来执行此操作。

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

4

4 回答 4

18

ZipOutputStream可以从 Clojure 使用 Java 中的股票。我不知道某处是否有图书馆。我使用带有一个小辅助宏的普通 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)))
于 2013-07-31T09:24:03.320 回答
3

文件的所有压缩和解压都可以通过一个简单的 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")
于 2015-09-01T20:48:59.520 回答
0

您可以使用包装Apache Ant的 rtcritical/clj-ant-tasks库,并使用单个命令进行压缩。

添加库依赖 [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任务。

有关更多信息,请参阅https://github.com/rtcritical/clj-ant-tasks

于 2020-01-27T16:01:05.783 回答
0

你可以导入这个(gzip)https://gist.github.com/bpsm/1858654 它很有趣。或者更准确地说,你可以使用这个

(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)))))
于 2016-02-27T21:24:01.783 回答