2016-04-26 49 views
0

我想壓縮包含文件和子目錄的目錄。我做到了這一點,工作得很好,但我越來越不尋常和好奇的文件結構(至少我看到了這種方式)。使用Java壓縮目錄時獲取奇怪的結構文件

這是創建的文件:Empty zip file當我點擊它,我看到這樣一個「空」目錄:enter image description here但是當我解壓這個我看到這個文件結構(不是所有的名稱是exacly,因爲它們是在顯示下圖):

|mantenimiento 
    |Carpeta_A 
    |File1.txt 
    |File2.txt 
    |Carpeta_B 
    |Sub_carpetaB 
     |SubfileB.txt 
    |Subfile1B.txt 
    |Subfile2B.txt 
    |File12.txt 

我的問題在某種程度上是該文件夾「mantenimiento」就是我從(我要壓縮的目錄)zippping,我不希望它在那裏,所以當我解壓剛剛創建的.zip文件我想要它與這個文件結構(這是「mantenimiento」目錄內的文件和目錄):Correct directory structure另一件事是當我點擊.zip文件我想看到文件nd目錄就像上面顯示的圖像一樣。

我不知道我的代碼有什麼問題,我搜索了但沒有找到我的問題可能的參考。

這裏是我的代碼:

private void zipFiles(List<File> files, String directory) throws IOException 
{ 
    ZipOutputStream zos = null; 
    ZipEntry zipEntry = null; 
    FileInputStream fin = null; 
    FileOutputStream fos = null; 
    BufferedInputStream in = null; 

    String zipFileName = getZipFileName(); 

    try 
    { 
     fos = new FileOutputStream(File.separatorChar + zipFileName + EXTENSION); 

     zos = new ZipOutputStream(fos); 

     byte[] buf = new byte[1024]; 

     int len; 

     for(File file : files) 
     { 
      zipEntry = new ZipEntry(file.toString()); 
      fin = new FileInputStream(file); 
      in = new BufferedInputStream(fin); 
      zos.putNextEntry(zipEntry); 
      while ((len = in.read(buf)) >= 0) 
      { 
       zos.write(buf, 0, len); 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.err.println("No fue posible zipear los archivos"); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     in.close(); 
     zos.closeEntry(); 
     zos.close(); 
    } 

} 

希望你們能給我什麼,我做錯了,或我錯過了什麼暗示。

非常感謝。

順便說一句,我給該方法的目錄從來沒有使用過。我給出的另一個參數是包含C:\ mantenimiento目錄中所有文件和目錄的文件列表。

+0

您能分享getZipFileName方法嗎? – Sanj

+0

該方法實現非常簡單:private String getZipFileName method() { \t String zipName; \t \t Date currentDate = newDate(); \t \t SimpleDateFormat formatter = SimpleDateFormat(「yyyy_MM_dd_HH-mm-ss」); \t \t zipName = formatter.format(currentDate); \t \t return zipName; \t } –

回答

0

我曾經有一個windows和zip文件的問題,其中創建的zip文件中沒有包含文件夾的條目(即/,/Carpeta_A等),只有文件條目。嘗試爲沒有流內容的文件夾添加ZipEntries。

但是,作爲Java的某種龐大的Zip API的替代方案,您可以改用Filesystem(自Java7以來)。以下示例適用於Java8(lambda):

//Path pathToZip = Paths.get("path/to/your/folder"); 
//Path zipFile = Paths.get("file.zip"); 

public Path zipPath(Path pathToZip, Path zipFile) { 
    Map<String, String> env = new HashMap<String, String>() {{ 
     put("create", "true"); 
    }}; 

    try (FileSystem zipFs = FileSystems.newFileSystem(URI.create("jar:" + zipFile.toUri()), env)) { 
     Path root = zipFs.getPath("/"); 
     Files.walk(pathToZip).forEach(path -> zip(root, path)); 
    } 
} 

private static void zip(final Path zipRoot, final Path currentPath) { 

    Path entryPath = zipRoot.resolve(currentPath.toString()); 
    try { 
     Files.createDirectories(entryPath.getParent()); 
     Files.copy(currentPath, entryPath); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 

} 
+0

我想用Java7嘗試一下,因爲我們建議您使用Java 6。但是,我必須嘗試使用​​這種方法。「嘗試爲沒有流式內容的文件夾添加ZipEntries。」 –

+0

嘗試在Windows中創建一個壓縮文件,並使用類似7zip的工具或直接使用java打開它並列出條目。如果我不是完全錯誤的,那麼應該有任何表示路徑的條目,或者他們以類似的東西開始。但是,如何創建zip的條目以及Windows如何處理它(或者不是) –