Question

Existe-t-il un support intégré dans Groovy pour gérer les fichiers Zip (façon groovy)?

Ou dois-je utiliser le fichier java.util.zip.ZipFile de Java pour traiter les fichiers Zip dans Groovy?

Était-ce utile?

La solution

Autant que je sache, il n'y a pas de façon native. Mais consultez cet article sur la manière d'ajouter un code < > .zip (...) dans File, ce qui serait très proche de ce que vous recherchez. Vous devez juste créer une méthode .unzip (...) .

Autres conseils

Peut-être que Groovy n’a pas de support «natif» pour les fichiers zip, mais il est toujours assez simple de travailler avec eux.

Je travaille avec des fichiers zip et voici une partie de la logique que j'utilise:

def zipFile = new java.util.zip.ZipFile(new File('some.zip'))

zipFile.entries().each {
   println zipFile.getInputStream(it).text
}

Vous pouvez ajouter une logique supplémentaire à l'aide d'une méthode findAll :

def zipFile = new java.util.zip.ZipFile(new File('some.zip'))

zipFile.entries().findAll { !it.directory }.each {
   println zipFile.getInputStream(it).text
}

D'après mon expérience, la meilleure façon de procéder consiste à utiliser Antbuilder:

def ant = new AntBuilder()   // create an antbuilder

ant.unzip(  src:"your-src.zip",
            dest:"your-dest-directory",
            overwrite:"false" )

De cette façon, vous n'êtes pas responsable de toutes les tâches compliquées - Ant en prend soin pour vous. Évidemment, si vous avez besoin de quelque chose de plus granulaire, cela ne fonctionnera pas, mais pour la plupart des scénarios "décompressez simplement ce fichier", cela est vraiment efficace.

Pour utiliser antbuilder, incluez simplement ant.jar et ant-launcher.jar dans votre chemin d'accès aux classes.

Le projet d’extension commune Groovy fournit cette fonctionnalité à Groovy version 2.0 et ultérieure: https: // github. com / timyates / groovy-common-extensions

Cet article développe l'exemple AntBuilder.

http: //preferisco.blogspot .com / 2010/06 / using-goovy-antbuilder-to-zip-unzip.html

Toutefois, en principe, existe-t-il un moyen de connaître toutes les propriétés, fermetures, cartes, etc. pouvant être utilisées lors de la recherche d'une nouvelle facette dans groovy / java? Il semble y avoir beaucoup de choses vraiment utiles, mais comment débloquer leurs trésors cachés? Les fonctions de code complet de NetBeans / Eclipse semblent maintenant désespérément limitées dans la nouvelle richesse linguistique que nous avons ici.

Décompresser à l'aide d'AntBuilder est un bon moyen.
La deuxième option est d’utiliser une bibliothèque tierce. Je recommande Zip4j

.

Bien que la question soit un peu différente, j’ai commencé à utiliser Groovy pour un DSL que je construisais, mais finalement à Gradle comme point de départ pour mieux gérer une grande partie des tâches basées sur des fichiers que je voulais. faire (par exemple, décompresser et décompresser des fichiers, exécuter d'autres programmes, etc.). Gradle s'appuie sur ce que groovy peut faire et peut être étendu via des plugins.

// build.gradle
task doUnTar << {
    copy {
        // tarTree uses file ext to guess compression, or may be specific
        from tarTree(resources.gzip('foo.tar.gz'))
        into getBuildDir()
    }
}

task doUnZip << {
    copy {
        from zipTree('bar.zip')
        into getBuildDir()
    }
}

Ensuite, par exemple (ceci extrait le bar.zip et le foo.tgz dans le répertoire build ):

$ gradle doUnZip
$ gradle doUnTar

Les méthodes groovy ci-dessous seront décompressées dans un dossier spécifique (dossier C: \). J'espère que cela vous aidera.

import org.apache.commons.io.FileUtils
import java.nio.file.Files
import java.nio.file.Paths
import java.util.zip.ZipFile

def unzipFile(File file) {
    cleanupFolder()
    def zipFile = new ZipFile(file)
    zipFile.entries().each { it ->
        def path = Paths.get('c:\\folder\\' + it.name)
        if(it.directory){
            Files.createDirectories(path)
        }
        else {
            def parentDir = path.getParent()
            if (!Files.exists(parentDir)) {
                Files.createDirectories(parentDir)
            }
            Files.copy(zipFile.getInputStream(it), path)
        }
    }
}

private cleanupFolder() {
    FileUtils.deleteDirectory(new File('c:\\folder\\'))
}
def zip(String s){
    def targetStream = new ByteArrayOutputStream()
    def zipStream = new GZIPOutputStream(targetStream)
    zipStream.write(s.getBytes())
    zipStream.close()
    def zipped = targetStream.toByteArray()
    targetStream.close()
    return zipped.encodeBase64()
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top