1 /** 2 * 該方法遞歸實現將多個文件夾壓縮在同一個zip包中 然后刪除文件夾directoryName 下需要被壓縮的文件。 3 * @param directoryName 文件夾路徑 4 * @param zos 壓縮流 ZipOutputStream 確定壓縮包生成的位置 5 * @param basePath 用於傳給 ZipEntry 用於壓縮包分文件夾第一級傳入可以為"" 6 * @throws IOException 7 */ 8 public static void zipDir(String directoryName, ZipOutputStream zos, String basePath) { 9 File file = new File(directoryName); 10 // 每一級別的遞歸 basePath 不應該被改變所以添加一個 參數 copyBasePath 11 String copyBasePath =""; 12 if (file.exists()) { 13 File[] fileList = file.listFiles(); 14 for (File f : fileList) { 15 if (f.isDirectory()) { 16 // 拼接文件夾目錄 17 if (!"".equals(basePath)) { 18 copyBasePath = basePath+File.separator+f.getName(); 19 } else { 20 copyBasePath = f.getName(); 21 } 22 // 繼續遞歸文件夾 23 zipDir(directoryName + File.separator + f.getName(), zos, copyBasePath); 24 } else { 25 // 壓縮單個文件到 zos 26 String zipName; 27 if (!"".equals(basePath)) { 28 zipName = basePath + File.separator + f.getName(); 29 } else { 30 zipName = f.getName(); 31 } 32 try { 33 // zos.putNextEntry 開始添加壓縮文件 ZipEntry傳入的參數 zipName如果包含了層級關系就會生成文件夾 34 zos.putNextEntry(new ZipEntry(zipName)); 35 int len; 36 FileInputStream is = new FileInputStream(f); 37 byte[] bytes = new byte[1024]; 38 while ((len = is.read(bytes)) != -1) { 39 zos.write(bytes, 0, len); 40 } 41 zos.flush(); 42 // zos.closeEntry() 結束當前壓縮文件的添加 43 zos.closeEntry(); 44 is.close(); 45 } catch (FileNotFoundException e) { 46 e.printStackTrace(); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 } 50 } 51 Boolean isDelete = f.delete(); 52 System.out.println(f.getName()+"刪除是否成功: "+isDelete); 53 } 54 } 55 }
