6 votes

Créer une archive zip à partir d'un dossier et préserver la structure avec Node.js

J'essaie d'utiliser Node.js pour créer un fichier zip à partir d'un dossier existant, tout en préservant la structure.

J'espérais qu'il y aurait un module simple pour permettre ce genre de choses :

archiver.create("../folder", function(zipFile){ 
    console.log('et viola');
});

mais je ne trouve rien de tel !

J'ai cherché sur Internet, et le meilleur que j'ai trouvé jusqu'à présent est zipstream, mais pour autant que je sache, il n'y a aucun moyen de faire ce que je veux. Je ne veux pas vraiment faire appel à des utilitaires en ligne de commande, car l'application doit être multiplateforme.

Toute aide serait grandement appréciée.

Merci.

2voto

Jan Jongboom Points 15148

Ce n'est pas entièrement sans code, mais vous pouvez utiliser node-native-zip en collaboration avec dossier.js . Utilisation :

function zipUpAFolder (dir, callback) {
    var archive = new zip();

    // map all files in the approot thru this function
    folder.mapAllFiles(dir, function (path, stats, callback) {
        // prepare for the .addFiles function
        callback({ 
            name: path.replace(dir, "").substr(1), 
            path: path 
        });
    }, function (err, data) {
        if (err) return callback(err);

        // add the files to the zip
        archive.addFiles(data, function (err) {
            if (err) return callback(err);

            // write the zip file
            fs.writeFile(dir + ".zip", archive.toBuffer(), function (err) {
                if (err) return callback(err);

                callback(null, dir + ".zip");
            });                    
        });
    });    
}

1voto

Gopherkhan Points 2269

Cela peut être fait encore plus simplement en utilisant la fonction execfile intégrée de node. Elle crée un processus et exécute la commande zip à travers le système d'exploitation, de manière native. Tout fonctionne.

var execFile = require('child_process').execFile;

execFile('zip', ['-r', '-j', zipName, pathToFolder], function(err, stdout) {
        console.log(err);
        logZipFile(localPath);
    });

L'option -j permet de "bazarder" le chemin du fichier, si vous zippez un répertoire sib et que vous ne voulez pas d'imbrication excessive dans le fichier zip.

Voici un peu de documentation sur execfile . Voici une page de manuel pour zip .

0voto

Igor S. Points 1330

Utilisation de Easy-zip , npm install easy-zip que vous pouvez faire :

var zip5 = new EasyZip();
zip5.zipFolder('../easy-zip',function(){
    zip5.writeToFile('folderall.zip');
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X