Compresser le répertoire en tar.gz avec Commons Compress
Je suis en cours d'exécution dans un problème en utilisant les communes de compresser de la bibliothèque pour créer un tar.gz d'un répertoire. J'ai une structure de répertoire qui est comme suit.
parent/
child/
file1.raw
fileN.raw
J'utilise le code suivant pour effectuer la compression. Il fonctionne très bien sans exceptions. Cependant, lorsque j'essaie de décompresser que tar.gz je ne obtenir un seul fichier avec le nom "childDirToCompress". Son la taille correcte de sorte que les fichiers ont clairement été ajoutés les uns aux autres dans le goudronnage des processus. La sortie désirée serait un répertoire. Je ne peux pas comprendre ce que je fais mal. Peut-sage communes compresser m'ont mis sur la bonne voie?
CreateTarGZ() throws CompressorException, FileNotFoundException, ArchiveException, IOException {
File f = new File("parent");
File f2 = new File("parent/childDirToCompress");
File outFile = new File(f2.getAbsolutePath() + ".tar.gz");
if(!outFile.exists()){
outFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(outFile);
TarArchiveOutputStream taos = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream(fos)));
taos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR);
taos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
addFilesToCompression(taos, f2, ".");
taos.close();
}
private static void addFilesToCompression(TarArchiveOutputStream taos, File file, String dir) throws IOException{
taos.putArchiveEntry(new TarArchiveEntry(file, dir));
if (file.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
IOUtils.copy(bis, taos);
taos.closeArchiveEntry();
bis.close();
}
else if(file.isDirectory()) {
taos.closeArchiveEntry();
for (File childFile : file.listFiles()) {
addFilesToCompression(taos, childFile, file.getName());
}
}
}
source d'informationauteur awfulHack
Vous devez vous connecter pour publier un commentaire.
J'ai suivi cette solution et cela a fonctionné jusqu'à ce que j'ai été le traitement d'un plus grand ensemble de fichiers et il se bloque de façon aléatoire après le traitement de 15000 16000 fichiers. la ligne suivante est la fuite des gestionnaires de fichiers:
et le code s'est écrasé avec un "Trop de fichiers ouverts" erreur au niveau de l'OS
La suite de changement mineur de résoudre le problème:
Je n'ai pas compris exactement ce qui n'allait pas, mais un récurer les caches de google, j'ai trouvé un exemple de travail. Désolé pour le tumbleweed!
J'ai fini par faire ce qui suit:
Ce prend soin de la partie de la périphérie des cas qui se présentent dans les autres solutions.