Ведение каталога Windows в zip-файле - PullRequest
0 голосов
/ 28 октября 2011

Я просмотрел последние вопросы по этому вопросу, но не могу найти решение своей проблемы. Мне нужно заархивировать каталог, содержащий несколько каталогов, содержащих все содержимое (в основном текстовые файлы). Когда я открываю zip, я хочу получить тот же список каталогов обратно.

Моя проблема в том, что я могу заархивировать содержимое, но мой zip-файл либо содержит только простые файлы (без каталогов), либо он поврежден. Кто-нибудь делал это?

Код, который я публикую, производит поврежденные или, казалось бы, пустые почтовые индексы. Вот мои методы (кратко)

общедоступный zipDir

File dirObj = new File(fileDirectory);
    String outFilename = zipDirectory+File.separatorChar+filename+".zip";
    log.info("Zip Directory: " + outFilename);
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
    System.out.println("Creating : " + outFilename);
    addDir(dirObj, out);
    out.close();

addDir

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].getAbsolutePath());
      out.putNextEntry(new ZipEntry(files[i].getAbsolutePath()));
      int len;
      while ((len = in.read(tmpBuf)) > 0) {
        out.write(tmpBuf, 0, len);
      }
      out.closeEntry();
      in.close();
    }

Главная

zipDir(filename, properties);

1 Ответ

1 голос
/ 28 октября 2011

Я нашел решение. Этот код делает именно то, что мне нужно. Он архивирует каталог и поддерживает структуру каталогов.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FolderZiper {
  public static void main(String[] a) throws Exception {
    zipFolder("c:\\a", "c:\\a.zip");
  }

  static public void zipFolder(String srcFolder, String destZipFile) throws Exception {
    ZipOutputStream zip = null;
    FileOutputStream fileWriter = null;

    fileWriter = new FileOutputStream(destZipFile);
    zip = new ZipOutputStream(fileWriter);

    addFolderToZip("", srcFolder, zip);
    zip.flush();
    zip.close();
  }

  static private void addFileToZip(String path, String srcFile, ZipOutputStream zip)
      throws Exception {

    File folder = new File(srcFile);
    if (folder.isDirectory()) {
      addFolderToZip(path, srcFile, zip);
    } else {
      byte[] buf = new byte[1024];
      int len;
      FileInputStream in = new FileInputStream(srcFile);
      zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
      while ((len = in.read(buf)) > 0) {
        zip.write(buf, 0, len);
      }
    }
  }

  static private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip)
      throws Exception {
    File folder = new File(srcFolder);

    for (String fileName : folder.list()) {
      if (path.equals("")) {
        addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip);
      } else {
        addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip);
      }
    }
  }
}
...