我正在制作一个SBT插件,我想要压缩一个目录。由于IO中的以下方法,这是可能的:
def zip(sources: Traversable[(File,String)], outputZip: File): Unit
在修改此方法之后,似乎只是简单地传递一个目录并期望生成的zip文件具有相同的文件&文件夹结构错误。传递目录(空或其他)会导致以下结果:
[error]...:zipper: java.util.zip.ZipException: ZIP file must have at least one entry
因此,似乎使用zip
方法的方法是逐步浏览目录并将每个文件单独添加到Traversable
对象。
假设我的理解是正确的,这让我觉得非常奇怪 - 很少用户需要选择要添加到档案中的内容。
对此有何想法?
答案 0 :(得分:1)
好像你可以使用它来编写一个包含来自多个地方的文件的zip。我可以在构建系统中看到它的使用。
答案 1 :(得分:0)
聚会有点晚了,但这应该可以满足您的需求:
val parentFolder: File = ???
val folderName: String = ???
val src: File = parentFolder / folderName
val tgt: File = parentFolder / s"$folderName.zip"
IO.zip(allSubpaths(src), tgt)
答案 2 :(得分:-1)
以下是使用sbt的IO类压缩目录的一些代码:
IO.withTemporaryDirectory(base => {
val dirToZip = new File(base, "lib")
IO.createDirectory(dirToZip)
IO.write(dirToZip / "test1", "test")
IO.write(dirToZip / "test2", "test")
val zip: File = base / ("test.zip")
IO.zip(allSubpaths(dirToZip), zip)
val out: File = base / "out"
IO.createDirectory(out)
IO.unzip(zip,out) mustEqual(Set(out /"test1", out / "test2"))
IO.delete((out ** "*").get)
//Create a zip containing this lib directory but under a different directory in the zip
val finder: PathFinder = dirToZip ** "*" --- dirToZip //Remove dirToZip as you can't rebase a directory to itself
IO.zip(finder x rebase(dirToZip, "newlib"), base / "rebased.zip")
IO.createDirectory(out)
IO.unzip(base / "rebased.zip",out) mustEqual(Set(out /"newlib"/"test1", out / "newlib"/ "test2"))
})
参见文档
http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Mapping-Files.html
http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Paths.html
有关创建要传递给IO.zip的Traversable对象的提示