zip une structure de dossier en utilisant java
-
29-09-2019 - |
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.
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:
- ouvrir une entrée dans le flux zip pour le répertoire donné
- Liste les fichiers et répertoires dans le répertoire donné, boucle à travers eux
- si une entrée est un fichier, ouvrez une entrée, le contenu du fichier à copier l'entrée, fermez-
- si une entrée est un répertoire, appelez cette méthode. Faire passer le flux zip
- 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.