2016-12-30 61 views
0

我有我的笔记本电脑以下目录:保留在拉链递归目录结构与Java 8

/tmp/ 
    myapp/ 
     assets/ 
      config.yml 
      models/ 
       troll.ply 
       tree.ply 
      textures/ 
       troll-skin.png 
       tree-skin.png 

我想压缩/tmp/myapp/assets(及其所有的递归内容)成一个名为assets.zip ZIP,这样,当我解压缩(通过unzip assets.zip)时,它保留assets文件夹下的目录结构。因此,解压缩后,它会在ZIP的“根目录”中显示config.yml,并在ZIP中显示2个目录(modelstextures)。该文件的其余部分将这些各子目录里面,等

当我运行这段代码:

File sourceDir = new File("/tmp/myapp/assets"); 
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 

File[] contents = sourceDir.listFiles(); 
for(File file : contents) { 
    zip.putNextEntry(new ZipEntry(file.name)); 
    InputStream isteam = new FileInputStream(file); 

    Files.copy(isteam, zip); 
    zip.closeEntry(); 
    isteam.close(); 
} 

zip.close(); 

代码正确地/Users/myuser/archives/assets.zip创建ZIP。

然而,当我将它解压缩(unzip /Users/myuser/archives/assets.zip),然后运行ls -al /Users/myuser/archives,我的输出是:

-rw-r--r-- 1 myuser 1754083733 492 Dec 30 14:14 assets.zip 
-rw-r--r-- 1 myuser 1754083733 10 Dec 30 14:14 config.yml 
-rw-r--r-- 1 myuser 1754083733 7 Dec 30 14:14 models 
-rw-r--r-- 1 myuser 1754083733 9 Dec 30 14:14 textures 

因此,无论modelstextures正在像文件处理(而不是作为目录)。此外,当我采取偷看在“models文件”的内容,看来该内容troll.plytree.ply已串接在它的内部,并同上为“tree文件”与2个PNG图像。

我该如何调整它,使目录结构(无论多深/嵌套)始终保存在结果ZIP中?

+0

有一个在你的代码没有递归... – Holger

回答

1

你或许可以用递归的方法调用保留子目录结构:

private static void addDir(File sourceDir, ZipOutputStream zip) throws IOException { 
    File[] contents = sourceDir.listFiles(); 
    for(File file : contents) { 
     if(file.isDirectory()){ 
      addDir(file, zip); 
     } else { 
      zip.putNextEntry(new ZipEntry(file.getAbsolutePath().replace("/tmp/myapp/",""))); 
      System.out.println("file name " + file.getAbsolutePath().replace("/tmp/myapp/","")); 
      Path rn_demo = Paths.get(String.valueOf(file)); 
      Files.copy(rn_demo, zip); 
     } 
    } 
    zip.closeEntry(); 
} 

,你在下面主要方法调用:

public static void main(String[] args) throws IOException { 
    File sourceDir = new File("/tmp/myapp/assets"); 
    ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/Users/myuser/archives/assets.zip")); 
    addDir(sourceDir, zip); 
    zip.close(); 
} 
+0

谢谢@Sasi(+1)你的解决方案**出现**在运行时工作,但是当我从命令行解压ZIP文件时,出现以下错误:'Archive:assets.zip End of未找到中央目录签名。这个文件不是一个zip文件,或者它构成一个多部分档案的一个磁盘。在后一种情况下,中心目录和zipfile注释将在此存档的最后一个磁盘上找到。 unzip:无法在assets.zip或assets.zip.zip之一中找到zipfile目录,并且无法找到assets.zip.ZIP,句点...' – smeeb

+0

我注意到您没有在任何地方关闭ZIP条目('zip.closeEntry() '),这可能是问题吗? – smeeb

+0

@smeeb:你如何解压缩文件?我没有任何问题。你可以从你的cmd行输入文件“yourfilename”,(如果是OSX或* inux系统,这将给出文件的类型) –