Tout en essayant de compresser une archive en utilisant l' java.util.zip
j'ai rencontré beaucoup de problèmes dont la plupart je l'ai résolu. Maintenant que je reçois enfin une partie de la sortie j'ai du mal à obtenir que le "droit de sortie". J'ai un extrait de fichier ODT (répertoire serait plus raccord d'une description) à qui j'ai fait quelques modifications. Maintenant, je veux compresser le répertoire en tant que de recréer le fichier ODT structure. La compression de l'annuaire et de le renommer à la fin .odt fonctionne bien, donc il devrait y avoir aucun problème.
Le principal problème est que je perds la structure interne de l'annuaire. Tout devient "à plat" et je n'arrive pas à trouver un moyen de conserver l'original de la structure multi-couches. J'apprécierais un peu d'aide sur ce que je n'arrive pas a trouver le problème.
Voici les extraits de code:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
compressDirectory(TEMPARCH, out);
L' SEPARATOR
est le système de séparateur de fichiers et l' FILEPATH
est le chemin de l'original ODT que je vais remplacer mais ne l'ont pas fait ici à des fins de test. J'écris simplement pour un test.zip fichier dans le même répertoire.
private void compressDirectory(String directory, ZipOutputStream out) throws IOException
{
File fileToCompress = new File(directory);
// list contents.
String[] contents = fileToCompress.list();
// iterate through directory and compress files.
for(int i = 0; i < contents.length; i++)
{
File f = new File(directory, contents[i]);
// testing type. directories and files have to be treated separately.
if(f.isDirectory())
{
// add empty directory
out.putNextEntry(new ZipEntry(f.getName() + SEPARATOR));
// initiate recursive call
compressDirectory(f.getPath(), out);
// continue the iteration
continue;
}else{
// prepare stream to read file.
FileInputStream in = new FileInputStream(f);
// create ZipEntry and add to outputting stream.
out.putNextEntry(new ZipEntry(f.getName()));
// write the data.
int len;
while((len = in.read(data)) > 0)
{
out.write(data, 0, len);
}
out.flush();
out.closeEntry();
in.close();
}
}
}
Le répertoire qui contient les fichiers de zip est quelque part dans l'espace utilisateur et pas dans le même répertoire que le fichier résultant. Je suppose que cela pourrait être un problème, mais je ne peux pas vraiment voir comment. Aussi j'ai pensé que le problème pouvait être en utilisant le même flux de sortie mais encore une fois je ne vois pas comment. J'ai vu dans certains des exemples et des tutoriels qu'ils utilisent getPath()
au lieu de getName()
mais le changement qui me donne un vide de fichier zip.