[英]Zipping sub directories is zipping only content of sub directories but not the sub directories
下面是我試過的代碼。 它只壓縮子文件夾的內容,而不是我需要壓縮所有子文件夾以及內容的文件夾。 我在這里做錯了什么。 示例:我在演示文件夾中有一個文件夾“演示”,我有 a、b、c 文件夾。 我想壓縮 a、b、c 以及內容,並且 zip 不應包含演示的父級。
static void addDir(File dirObj, ZipOutputStream out) throws IOException {
File[] files = dirObj.listFiles();
byte[] tmpBuf = new byte[1024];
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
addDir(files[i], out);
continue;
}
FileInputStream in = new FileInputStream(files[i].getAbsolutePath());
System.out.println(" Adding: " + files[i].getName());
out.putNextEntry(new ZipEntry(files[i].getName()));
int len;
while ((len = in.read(tmpBuf)) > 0) {
out.write(tmpBuf, 0, len);
}
out.closeEntry();
in.close();
}
}
public static void zipFiles(File[] subd) {
String zipFile = "test.zip";
try {
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
for (File dir : subd) {
addDir(dir, zos);
}
// close the ZipOutputStream
zos.close();
} catch (IOException ioe) {
System.out.println("Error creating zip file: " + ioe);
}
這是我為具有層次結構和沒有層次結構的 zip 文件和目錄所做的代碼。 zip.getHierarchy().equals("F")
部分完成您想做的工作。 在此代碼中,您必須將源文件、目標、層次結構 (T/F) 作為參數傳遞。 此外,您可能需要一個 DTO 類。
public static void Start() throws IOException{
FileOutputStream fos = new FileOutputStream(zip.getDestination());
ZipOutputStream zipOut = new ZipOutputStream(fos);
File fileToZip = new File(zip.getSourcePath());
zipDirectory(fileToZip, fileToZip.getName(), zipOut);
zipOut.close();
fos.close();
}
public static void zipDirectory(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
if (fileToZip.isDirectory()) {
File[] children = fileToZip.listFiles();
for (File childFile : children) {
if(zip.getHierarchy().equals("T")) {
zipDirectory(childFile, childFile.getPath(), zipOut);
}else if(zip.getHierarchy().equals("F")){
zipDirectory(childFile, childFile.getName(), zipOut);
}
}
return;
}
doZip(fileToZip,fileName,zipOut);
}
public static void doZip(File fileToZip,String fileName,ZipOutputStream zipOut) throws IOException {
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.