2013-02-25 4 views
1

У меня есть следующая структура папок:Zip содержимое корневой папки, не имея корень в почтовом файле

 
RootFolder 
| 
| 
| -->F1-->F1.1-->t1.txt,t2.txt 
    -->F2-->F2.2-->t3.txt 

я добиться успеха, используя следующий код, чтобы получить следующий файл почтового индекса:

результата .zip ->, который содержит:

 
RootFolder 
| 
| 
| -->F1-->F1.1-->t1.txt,t2.txt 
    -->F2-->F2.2-->t3.txt 

мне нужно создать почтовый файл, который имеет все «RootFolder» содержимое без создания корневой папки «RootFolder»;

Я имею в виду, я нужен результат, чтобы быть похожим:

result.zip ->, который содержит:

 
| 
| 
| -->F1-->F1.1-->t1.txt,t2.txt 
    -->F2-->F2.2-->t3.txt 
public static void main(String[] args) throws Exception { 
    zipFolder("c:/new/RootFolder", "c:/new/result.zip"); 
} 


static public void zipFolder(String srcFolder, String destZipFile) 
throws IOException, FileNotFoundException { 
    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 IOException, FileNotFoundException { 

    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); 
     } 
     in.close(); 
    } 
} 

    static public void addFolderToZip(String path, String srcFolder, 
      ZipOutputStream zip) throws IOException, FileNotFoundException { 
     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); 
     } 
    } 
} 

ответ

1

Что вам нужно сделать, это добавить файлы, начиная не с вашей корневой папке, но с ее содержимым.

Что-то вроде:

filelist = getFileList(rootFolder) 
foreach(File f : filelist){ 
    addFolderToZip(f) 
} 

Извините за псевдокода, не помню, оригинальные названия функций и не может проверить их прямо сейчас, но они могут быть легко гугле.

Дело в том, чтобы просто пропустить создание папки в архиве для корневой папки.

+0

Я пытался сделайте это, но каждый раз, когда я заканчиваю исключение из этого грязного алгоритма. – Echo

+0

@Echo, Какое исключение? Покажите, что вы пытались сделать. – svz

+0

: Я пытался найти самое простое решение :) – Echo

1

Я написал некоторые вспомогательные методы для копирования каталогов в файл Zip с помощью NIO API File (библиотека Open Source):

Maven:

<dependency> 
    <groupId>org.softsmithy.lib</groupId> 
    <artifactId>softsmithy-lib-core</artifactId> 
    <version>0.3</version> 
</dependency> 

Учебник:

http://softsmithy.sourceforge.net/lib/current/docs/tutorial/nio-file/index.html#AddZipResourceSample

API: CopyFileVisitor.copy

+0

Я прочитал его, и это приятно. Однако, согласно моему чтению, он также помещает папку с контейнером в файл zip. Я прав! – Echo

+0

Я решил, как я сказал ниже. Спасибо Puce – Echo

+1

Нет, не следует, если вы опустите 2 строки в примере с комментарием «Добавляет имя каталога src в zip. Вы можете пропустить это, если хотите просто скопировать содержимое." – Puce

0

Я пытался найти самый простой способ решить мою проблему. я решил, что будет просто удалив имя корневого каталога при сохранении в файл почтового индекса, используя следующие:

String pathAfterOmittingtheRootFolder=path.replace(ROOT_FOLDER_NAME, ""); 

Полный метод будет:

static private void addFileToZip(String path, String srcFile, 
     ZipOutputStream zip,String exportedRootDirectory) throws IOException, FileNotFoundException { 

    File folder = new File(srcFile); 
    if (folder.isDirectory()) { 

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

}