Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Clojure递归压缩文件夹_Java_Clojure_Zip - Fatal编程技术网

Java 如何使用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

我想用clojure递归压缩一个文件夹。这种文件夹的一个例子是

├── 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/**"})