【问题标题】:Zip application from the current folder当前文件夹中的 Zip 应用程序
【发布时间】:2017-10-05 09:28:35
【问题描述】:

我有 node.js 应用程序,我需要使用来自的命令压缩所有当前文件夹 并获取根目录上的 zip

为此,我想使用archiver npm 包,但我不明白以下内容:

  1. 我放置当前文件夹的位置(因为我想压缩所有应用程序)
  2. 我应该把 zip 的名称放在哪里(执行命令时应该创建的 zip)

我的应用具有以下结构

MyApp
  Node_modules
  server.js
  app.js 
  package.json
  arc.js

arc.js 中我已经放置了所有的 zip 逻辑,所以我想我需要提供 zipPath(在我的例子中是'./') 和像 myZip 这样的 zip 名称……

我尝试了以下但没有成功,有什么想法吗?

var fs = require('fs');
var archiver = require('archiver');

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/.');
var archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
});

// listen for all archive data to be written
output.on('close', function() {
    console.log(archive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.on('warning', function(err) {
    if (err.code === 'ENOENT') {
        // log warning
    } else {
        // throw error
        throw err;
    }
});

// good practice to catch this error explicitly
archive.on('error', function(err) {
    throw err;
});

// pipe archive data to the file
archive.pipe(output);

当我打开命令行时需要它

folder->myApp-> 运行 zip arc 并将在当前路径下创建压缩文件(在这种情况下是根目录....)

【问题讨论】:

    标签: javascript node.js zip archive


    【解决方案1】:

    您可以使用glob 方法,但请确保排除*.zip 文件。否则,zip 文件本身将成为存档的一部分。 这是一个例子:

    // require modules
    var fs = require('fs');
    var archiver = require('archiver');
    
    // create a file to stream archive data to.
    var output = fs.createWriteStream(__dirname + '/example.zip');
    var archive = archiver('zip', {
        zlib: { level: 9 } // Sets the compression level.
    });
    
    // listen for all archive data to be written
    output.on('close', function () {
        console.log(archive.pointer() + ' total bytes');
        console.log('archiver has been finalized and the output file descriptor has closed.');
    });
    
    // good practice to catch warnings (ie stat failures and other non-blocking errors)
    archive.on('warning', function (err) {
        if (err.code === 'ENOENT') {
            // log warning
        } else {
            // throw error
            throw err;
        }
    });
    
    // good practice to catch this error explicitly
    archive.on('error', function (err) {
        throw err;
    });
    
    // pipe archive data to the file
    archive.pipe(output);
    
    archive.glob('**/*', { ignore: ['*.zip'] });
    
    archive.finalize();
    

    【讨论】:

    • 我需要一些简单的方法来执行它...示例将非常有帮助?也许将其添加到 package.json 中的脚本部分,不知道如何因为我需要节点...
    • 只需在您的 cmd 中执行 node arc.js,或在 package.json 中将 "archive": "node arc.js" 添加到脚本部分。
    • 最后一个问题,当我使用node arc.js 运行它时,它按预期工作......现在我输入了script 标签(package.json)"archive": "node arc.js",当我使用@ 运行它时987654331@我收到错误,知道如何从脚本运行它吗?谢谢!
    • 使用 npm 从 package.json 文件运行脚本。所以就做npm archive。就是这样。 npm 是节点包管理器。 ;)
    • 另外你能不能说一下这有什么作用? archive.glob('**/*',
    【解决方案2】:

    github of node-archiver 中有一个example folder



    我放置当前文件夹的位置(因为我想压缩所有 应用)

    例子:

    var file1 = __dirname + '/fixtures/file1.txt';
    var file2 = __dirname + '/fixtures/file2.txt';
    
    archive
      .append(fs.createReadStream(file1), { name: 'file1.txt' })
      .append(fs.createReadStream(file2), { name: 'file2.txt' })
      .finalize();
    

    具体关于您的案例和目录,您可以使用.directory() method of archiver


    我应该把 zip 的名称放在哪里(应该创建的 zip 执行命令时)

    例子:

    var output = fs.createWriteStream(__dirname + '/example-output.zip');
    

    【讨论】:

    • 谢谢,我已经看到了,但这是关于特定文件(文件 1 和 2),我想为整个应用程序执行此操作...
    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多