2013-06-12 58 views
1

我遇到了壓縮文件夾的問題。添加額外文件夾的Java zip util

I.e.我有這樣的

C:\Lazy\Test 

包含文件File1.cpp,File2.hpp一個文件夾,..等等

的壓縮了文件夾看起來像C:\懶惰\ Test.zip - >懶\測試其中包含所有的cpp和hpp文件。

我想刪除創建的額外子文件夾(Lazy \ Test)。這是爲什麼發生?

換句話說,壓縮文件不在zip文件的正下方,我不得不導航兩個文件夾才能到達它們。

我在哪裏可以在代碼中找到這個問題?

private void zipDirectory() { 

     File lazyDirectory = new File(defaultSaveLocation); 

     File[] files = lazyDirectory.listFiles(); 

     for (File file : files) { 

      if (file.isDirectory()) { 
      System.out.println("Zipping up " + file); 
      zipContents(file); 
      } 
     }  
    } 


public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException { 

    System.out.println("Writing '" + fileName + "' to zip file"); 

    File file = new File(fileName); 
    FileInputStream fis = new FileInputStream(file); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 

    byte[] bytes = new byte[1024]; 
    int length; 
    while ((length = fis.read(bytes)) >= 0) { 
     zos.write(bytes, 0, length); 
    } 

    zos.closeEntry(); 
    fis.close(); 

    } 

public static void zipContents(File dirToZip) { 

    List<File> fileList = new ArrayList<File>(); 

    File[] filesToZip = dirToZip.listFiles(); 

    for (File zipThis : filesToZip) { 

     String ext = ""; 

     int i = zipThis.toString().lastIndexOf('.'); 

     if (i > 0) { 
      ext = zipThis.toString().substring(i+1); 
     } 

     if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){ 
      fileList.add(zipThis); 
     } 

    } 


    try { 
     FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip"); 
     ZipOutputStream zos = new ZipOutputStream(fos); 

     for (File file : fileList) { 

      addToZip(file.toString(), zos); 

     } 

     } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

你的意思,你只需要在文件或子文件添加到壓縮在一壓縮文件中的單一平面目錄結構?因此'C:\ Lazy \ Test \ Super.cpp'變成壓縮文件中的'Super.cpp'? – MadProgrammer

+0

是的,這正是我的意思 –

回答

1

更改addToZip文件取File對象。用它來打開文件流,但只使用File#getName創建ZipEntry,如下...

public static void addToZip(File file, ZipOutputStream zos) throws FileNotFoundException, IOException { 

    System.out.println("Writing '" + fileName + "' to zip file"); 

    FileInputStream fis = new FileInputStream(file); 
    ZipEntry zipEntry = new ZipEntry(file.getName()); 
    zos.putNextEntry(zipEntry); 

    byte[] bytes = new byte[1024]; 
    int length; 
    while ((length = fis.read(bytes)) >= 0) { 
     zos.write(bytes, 0, length); 
    } 

    zos.closeEntry(); 
    fis.close(); 

} 
+0

我已經嘗試過。我得到了java.io.FileNotFoundException,因爲我不在我要壓縮的文件所在的同一目錄中,並且程序不知道在哪裏查找要壓縮的文件。 –

+0

即它缺少完整的路徑...... –

+0

所以。直接傳遞了'file'和改變'addToZip'包括入門... – MadProgrammer