Creating a zip archive from a folder and preserving structure with Node.js
Asked Answered
K

3

6

I'm trying to use Node.js to create a zip file from an existing folder, and preserve the structure.

I was hoping there would be a simple module to allow this kind of thing:

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

but I can't find anything of the sort!

I've been googling around, and the best I've found so far is zipstream, but as far as I can tell there's no way to do what I want. I don't really want to call into commandline utilities, as the the app has to be cross platform.

Any help would be greatly appreciated.

Thanks.

Kroo answered 23/3, 2012 at 15:15 Comment(0)
P
2

It's not entirely code free, but you can use node-native-zip in conjunction with folder.js. Usage:

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");
            });                    
        });
    });    
}
Peculiar answered 23/3, 2012 at 15:23 Comment(2)
Thanks very much! The zip is created, but unfortunately it's corrupted and appears empty. I'll play around with it and try and see what the problem is.Kroo
Actually, it only seems to be slightly corrupted ;) When I try and explore the created zip, it appears empty, but when I extract it, the contents look fine. Thanks for a great, swift answer!Kroo
M
2

This can be done even simpler using node's built-in execfile function. It spawns a process and executes the zip command through the os, natively. Everything just works.

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

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

The -j flag 'junks' the file path, if you are zipping a sibdirectory, and don't want excessive nesting within the zip file.

Here's some documentation on execfile. Here's a man page for zip.

Mchugh answered 15/8, 2012 at 17:33 Comment(1)
The op specifically said they wanted to native and cross platform and NOT a command line call.Coroner
C
0

Using Easy-zip, npm install easy-zip, you can do:

var zip5 = new EasyZip();
zip5.zipFolder('../easy-zip',function(){
    zip5.writeToFile('folderall.zip');
});
Cornelius answered 21/3, 2014 at 12:8 Comment(2)
I wouldn't recommend using this because of this issue.Corncob
I've been using easy-zip lately and haven't run into the issue that @rax highlighted.Duster

© 2022 - 2024 — McMap. All rights reserved.