Question

Je suis en train de zip la structure de fichier suivant sur ma machine,

parent/
parent/test1
parent/test1/image1.jpeg
parent/test2

Le problème que je ne peux pas ici est la structure de la fermeture éclair fichier ci-dessus en utilisant java. J'ai google et trouvé exemple de code mais il ne zipper les fichiers uniquement dans un dossier donné.

     File inFolder=new File("out");
     File outFolder=new File("Out.zip");
     ZipOutputStream out = new ZipOutputStream(new 
BufferedOutputStream(new FileOutputStream(outFolder)));
     BufferedInputStream in = null;
     byte[] data    = new byte[1000];
     String files[] = inFolder.list();
     for (int i=0; i<files.length; i++)
      {
      in = new BufferedInputStream(new FileInputStream
(inFolder.getPath() + "/" + files[i]), 1000);                  
out.putNextEntry(new ZipEntry(files[i])); 
      int count;
      while((count = in.read(data,0,1000)) != -1)
      {
           out.write(data, 0, count);
          }
      out.closeEntry();
      }
      out.flush();
      out.close();

Dans le code ci-dessus l'out est un dossier et nous avons besoin d'avoir un dossier files..also ne peut pas être vide s'il jette un java.util.zip.ZipException d'exception ou ne peut pas contenir des sous-dossiers des fichiers même à l'intérieur ( par exemple: sur \ newfolder \ image.jpeg) s'il jette un java.io.FileNotFoundException: out \ newfolder (Accès refusé)

.

Dans mon cas, im costructig la structure de fichier ci-dessus par quering la base de données parfois des dossiers vides le long de la structure des dossiers peut être avoir.

Quelqu'un peut me dire s'il vous plaît une solution?

Merci.

Était-ce utile?

La solution

écrire deux méthodes. La première prend dirpath fait un flux zip et appelle une autre méthode qui copie les fichiers au flux zip et appelle lui-même récursive pour les répertoires comme ci-dessous:

  1. ouvrir une entrée dans le flux zip pour le répertoire donné
  2. Liste les fichiers et répertoires dans le répertoire donné, boucle à travers eux
  3. si une entrée est un fichier, ouvrez une entrée, le contenu du fichier à copier l'entrée, fermez-
  4. si une entrée est un répertoire, appelez cette méthode. Faire passer le flux zip
  5. fermer l'entrée.

La première méthode ferme le flux postal.

Autres conseils

Ce qui est probablement passe est que vous essayez de traiter tous entrée en FileInputStream. Cependant, pour un répertoire, ce n'est pas vrai. Étant donné que le chemin est pas un fichier, lorsque vous essayez de le lire, un FileNotFoundException est jeté. Pour les répertoires, vous voulez toujours créer le ZipEntry, mais au lieu d'essayer de lire dans les données, il suffit de sauter et de passer à la voie suivante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top