2016-12-30 4 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系統,這將給出文件的類型) –