使用Node.js从文件夹创建zip归档并保留结构

6

我想使用Node.js从现有文件夹创建一个zip文件,并保留其结构。

我希望有一个简单的模块来实现这种操作:

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

但我找不到类似的东西!

我已经在谷歌上搜索了一番,目前为止最好的结果是zipstream,但据我所知,没有办法做到我想要的。我不想调用命令行实用程序,因为应用程序必须跨平台。

非常感谢任何帮助。

谢谢。

3个回答

2

虽然不完全是无代码,但您可以使用node-native-zipfolder.js结合使用。用法:

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");
            });                    
        });
    });    
}

非常感谢!压缩文件已经创建,但不幸的是它已经损坏并且为空。我会尝试调试并找出问题所在。 - user1257359
实际上,它似乎只是轻微地损坏了 ;) 当我尝试浏览创建的zip文件时,它看起来是空的,但是当我提取它时,内容看起来很好。感谢您迅速给出的优秀答案! - user1257359

2
这可以通过Node内置的execfile函数更简单地实现。它会生成一个进程,并通过操作系统本地执行zip命令。一切都可以正常工作。
var execFile = require('child_process').execFile;

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

“-j”标志将文件路径“丢弃”,如果您正在压缩一个子目录,并且不想在zip文件中出现过多的嵌套。
这里是execfile的一些文档。 这里是zip的man页面

该操作指定需要本地和跨平台,而不是命令行调用。 - JohnC

0
使用 Easy-zipnpm install easy-zip,你可以做到以下操作:
var zip5 = new EasyZip();
zip5.zipFolder('../easy-zip',function(){
    zip5.writeToFile('folderall.zip');
});

1
我不建议使用这个,因为有这个问题 - Rax
我最近一直在使用 easy-zip,并没有遇到 @rax 提出的问题。 - developius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接