Java 如何使用Clojure递归压缩文件夹
我想用clojure递归压缩一个文件夹。这种文件夹的一个例子是Java 如何使用Clojure递归压缩文件夹,java,clojure,zip,Java,Clojure,Zip,我想用clojure递归压缩一个文件夹。这种文件夹的一个例子是 ├── a ├── b │ ├── c │ │ └── ccc.txt │ └── bb.txt ├── c ├── a.txt └── b.txt 选项1:从Clojure内部使用操作系统 Ubuntu中使用zip的方法是在此结构的根目录中执行以下操作: zip -r result.zip * 但是你必须在工作目录中才能这样做。使用绝对路径将产生其他结果,同时省略所有路径当然会使结构变得平坦 问题是您无法更改C
├── a
├── b
│ ├── c
│ │ └── ccc.txt
│ └── bb.txt
├── c
├── a.txt
└── b.txt
选项1:从Clojure内部使用操作系统
Ubuntu中使用zip
的方法是在此结构的根目录中执行以下操作:
zip -r result.zip *
但是你必须在工作目录中才能这样做。使用绝对路径将产生其他结果,同时省略所有路径当然会使结构变得平坦
问题是您无法更改Clojure中的工作目录,我不知道这是
选项2:使用本机Clojure(或Java)
这应该是可能的,我在Clojure或Java包装器中找到了一些zip实现。但是,它们中的大多数用于单个文件
这可能是一个解决方案:
但在我尝试之前,我想现在就开始,否则就没有一个好的Clojure库。检查java.util.zip周围的一个漂亮的小包装器。使用streams和简单的Clojure库进行基于zip的压缩 基于@Kyle答案:
(require '[clojure.java.io :as io])
(import '[java.util.zip ZipEntry ZipOutputStream])
(defn zip-folder
"p input path, z output zip"
[p z]
(with-open [zip (ZipOutputStream. (io/output-stream z))]
(doseq [f (file-seq (io/file p)) :when (.isFile f)]
(.putNextEntry zip (ZipEntry. (str/replace-first (.getPath f) p "") ))
(io/copy f zip)
(.closeEntry zip)))
(io/file z))
您可以使用在一行代码中包装和压缩/解压的库
添加库依赖项[rtcritical/clj ant tasks“1.0.1”]
要压缩目录,请执行以下操作:
(run-ant-task :zip {:destfile "/tmp/archive.zip" :basedir "/tmp/archive"})
压缩目录,其中基本目录包含在存档中:
(run-ant-task :zip {:destfile "/tmp/archive.zip"
:basedir "/tmp"
:includes "archive/**"})
注意:此库名称空间中的run-ant任务函数也可用于运行任何其他Apache-ant任务
有关更多信息,请参见我有,也不是解决方案。您是否检查了Raynes测试的压缩?遍历目录树并对其进行压缩可能是一个良好的开端。它也有不同的压缩算法和像样的文档,我知道他很好的库并使用它,但还没有用于压缩,如果我记得好的话,我没有找到目录的解决方案,不过谢谢你的提示。非常好!当我有时间的时候,我会多检查一点,但如果它成功了,我肯定会接受。整洁,但还不是递归:)@JamesSharp
file seq
使用tree seq
,这是一种深度优先的方法。@kyle如果我理解正确的话:when(.isFile f)
将放弃子目录。我们需要类似于(defn zip folder”“[path filename zstream](带open[zip(或zstream(zipoutstream.(io/output stream filename)))](doseq[f(file seq(io/file path)))](if(.isFile f)(do(.putNextEntry zip(ZipEntry)(.getPath f))(io/copy f zip)(.closeEntry zip))(if(.isDirectory f)(zip文件夹(.getPath f)filename zip‘‘‘‘‘‘‘‘))
未经测试尽管不,子目录并没有被丢弃(我刚刚测试过),但我还有另一个问题:path/to/dir总是压缩的,即使我的结构只是从'dir'开始,空路径/to-dir也会被压缩。。。
(run-ant-task :zip {:destfile "/tmp/archive.zip" :basedir "/tmp/archive"})
(run-ant-task :zip {:destfile "/tmp/archive.zip"
:basedir "/tmp"
:includes "archive/**"})