web-dev-qa-db-fra.com

répertoires dans un fichier Zip lors de l'utilisation de Java.util.Zip.ZipOutputStream

Disons que j'ai un fichier t.txt, un répertoire t et un autre fichier t/t2.txt. Si j'utilise l'utilitaire Linux linux "Zip -r t.Zip t.txt t", j'obtiens un fichier Zip contenant les entrées suivantes (décompressez -l t.Zip):

Archive:  t.Zip
  Length     Date   Time    Name
 --------        ----      ----      ----
        9  04-11-09 09:11   t.txt
        0  04-11-09 09:12   t/
      15  04-11-09 09:12   t/t2.txt
 --------                           -------
       24                          3 files

Si j'essaie de reproduire ce comportement avec Java.util.Zip.ZipOutputStream et de créer une entrée Zip pour le répertoire, Java lève une exception. Il ne peut gérer que des fichiers. Je peux créer à/t2 L'entrée .txt dans le fichier Zip et l'ajout utilisent le contenu du fichier t2.txt mais je ne peux pas créer le répertoire. Pourquoi?

28
Bala

ZipOutputStream peut gérer les répertoires vides en ajoutant une barre oblique / après le nom du dossier. Essayez ( de )

public class Test {
    public static void main(String[] args) {
        try {
            FileOutputStream f = new FileOutputStream("test.Zip");
            ZipOutputStream Zip = new ZipOutputStream(new BufferedOutputStream(f));
            Zip.putNextEntry(new ZipEntry("xml/"));
            Zip.putNextEntry(new ZipEntry("xml/xml"));
            Zip.close();
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
41
John Ellinwood

Passez simplement par la source de Java.util.Zip.ZipEntry. Il traite un ZipEntry comme un répertoire si son nom se termine par des caractères "/". Suffixez simplement le nom du répertoire avec "/".

Vérifiez cet exemple pour compresser uniquement les répertoires vides, http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_ZipUtilities_ZipEmptyDirectory

Bonne chance.

23
user769087

Comme d'autres l'ont dit ici pour ajouter un répertoire vide, ajoutez "/" au nom du répertoire. Faites attention de ne PAS ajouter File.separator (égal à "\") qui ajoute en fait un fichier vide au Zip.

Il m'a fallu un certain temps pour comprendre quelle était mon erreur - j'espère que j'économiserai d'autres temps ...

13
chenop

Programme Java à compresser (les dossiers contiennent des fichiers vides ou pleins)

public class ZipUsingJavaUtil {
    /*
     * Zip function Zip all files and folders
     */
    @Override
    @SuppressWarnings("finally")
    public boolean zipFiles(String srcFolder, String destZipFile) {
        boolean result = false;
        try {
            System.out.println("Program Start zipping the given files");
            /*
             * send to the Zip procedure
             */
            zipFolder(srcFolder, destZipFile);
            result = true;
            System.out.println("Given files are successfully zipped");
        } catch (Exception e) {
            System.out.println("Some Errors happned during the Zip process");
        } finally {
            return result;
        }
    }

    /*
     * Zip the folders
     */
    private void zipFolder(String srcFolder, String destZipFile) throws Exception {
        ZipOutputStream Zip = null;
        FileOutputStream fileWriter = null;
        /*
         * create the output stream to Zip file result
         */
        fileWriter = new FileOutputStream(destZipFile);
        Zip = new ZipOutputStream(fileWriter);
        /*
         * add the folder to the Zip
         */
        addFolderToZip("", srcFolder, Zip);
        /*
         * close the Zip objects
         */
        Zip.flush();
        Zip.close();
    }

    /*
     * recursively add files to the Zip files
     */
    private void addFileToZip(String path, String srcFile, ZipOutputStream Zip, boolean flag) throws Exception {
        /*
         * create the file object for inputs
         */
        File folder = new File(srcFile);

        /*
         * if the folder is empty add empty folder to the Zip file
         */
        if (flag == true) {
            Zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/"));
        } else { /*
                 * if the current name is directory, recursively traverse it
                 * to get the files
                 */
            if (folder.isDirectory()) {
                /*
                 * if folder is not empty
                 */
                addFolderToZip(path, srcFile, Zip);
            } else {
                /*
                 * write the file to the output
                 */
                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) {
                    /*
                     * Write the Result
                     */
                    Zip.write(buf, 0, len);
                }
            }
        }
    }

    /*
     * add folder to the Zip file
     */
    private void addFolderToZip(String path, String srcFolder, ZipOutputStream Zip) throws Exception {
        File folder = new File(srcFolder);

        /*
         * check the empty folder
         */
        if (folder.list().length == 0) {
            System.out.println(folder.getName());
            addFileToZip(path, srcFolder, Zip, true);
        } else {
            /*
             * list the files in the folder
             */
            for (String fileName : folder.list()) {
                if (path.equals("")) {
                    addFileToZip(folder.getName(), srcFolder + "/" + fileName, Zip, false);
                } else {
                    addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, Zip, false);
                }
            }
        }
    }
}
13
programmmer

Vous pouvez ajouter "/" à la fin du nom du dossier. Utilisez simplement la commande suivante:

Zip.putNextEntry(new ZipEntry("xml/"));
7
Black Light