NodeJs解压流

3
我需要解压一些两级压缩文件:
file1.zip
  - file1.1.zip
    - data.txt
  - file1.2.zip
  - file1.3.zip

我需要在file1.zip中找到file1.1.zip中的data.txt文件,并忽略其他条目(entry.autodrain();)。

以下是有关zip的信息:

apshenichnikov@IAS-WS-UX02:/tmp$ file /var/logs-storage/wcm/119/2017-11-01-119-TcVXBh5RPEHTm86y7sOvJc7TjyQcAc6bqZVawcniIPwyJpWlYqCBJ2XNqBj1ikVF.zip
/var/logs-storage/wcm/119/2017-11-01-119-TcVXBh5RPEHTm86y7sOvJc7TjyQcAc6bqZVawcniIPwyJpWlYqCBJ2XNqBj1ikVF.zip: Zip archive data, at least v4.5 to extract


apshenichnikov@IAS-WS-UX02:/tmp$ unzip -t /var/logs-storage/wcm/119/2017-11-01-119-TcVXBh5RPEHTm86y7sOvJc7TjyQcAc6bqZVawcniIPwyJpWlYqCBJ2XNqBj1ikVF.zip
Archive:  /var/logs-storage/wcm/119/2017-11-01-119-TcVXBh5RPEHTm86y7sOvJc7TjyQcAc6bqZVawcniIPwyJpWlYqCBJ2XNqBj1ikVF.zip
    testing: datamining_119_20171101_clickevent.zip   OK
    testing: datamining_119_20171101_impressionvisibility.zip   OK
    testing: datamining_119_20171101_conversion.zip   OK
No errors detected in compressed data of /var/logs-storage/wcm/119/2017-11-01-119-TcVXBh5RPEHTm86y7sOvJc7TjyQcAc6bqZVawcniIPwyJpWlYqCBJ2XNqBj1ikVF.zip.

这是代码:

这是代码:

fs.createReadStream(source)
    .pipe(unzipper.Parse())
    .on('entry', (entry) =>
    {
        if (found || stop)
        {
            entry.autodrain();  
            return;
        }

        var filePath = entry.path;
        var type = entry.type; // 'Directory' or 'File'
        //var size = entry.size; // might be undefined in some archives

        log.info(getMessage(ID, util.format("Entry: %s", filePath)));

        var outPath = path.join(target, filePath);

        if (
            filePath.match(
                new RegExp(
                    util.format(
                        "datamining_\d+_\d+_%s.*\.zip", 
                        type
                    )
                )
            )
        ) {
            var outStream = fs.createWriteStream(outPath);
            entry.pipe(outStream);
            found = true;

            procLogStream.write(util.format(
                "%s Found: %s\r\n", 
                utils.getCurrentDate(),
                filePath
            ));

            outStream.on('finish', () =>
            {
                if (!stop)
                {
                    cb();
                    //tmpdir.removeCallback();
                    console.log('out stream finish');
                }

                stop = true;
            }).on('error', (err) =>
            {
                if (!stop)
                {
                    cb(err);
                    //tmpdir.removeCallback();
                    console.log('out stream error');
                }

                stop = true;
            });
        } else {
            entry.autodrain();
        }
    })
    .on('error', (err) =>
    {
        console.log('zip stream error');
        console.log(err);
        if (!found && !stop) {
            cb(err);
            //tmpdir.removeCallback();
        }

        stop = true;
    })
    .on('finish', () =>
    {
        console.log('zip stream finish');
        if (!found && !stop) {
            cb();
            //tmpdir.removeCallback();
        }

        stop = true;
    });

以下是错误信息:

info: [utils/worker.js] 5a27a822cb569b2db8bc493d: Entry: datamining_119_20171101_clickevent.zip
zip stream error
Error: invalid signature: 0x83268e0
    at /home/apshenichnikov/NetBeansProjects/lps/node_modules/unzip/lib/parse.js:59:13
    at runCallback (timers.js:666:20)
    at tryOnImmediate (timers.js:639:5)
    at processImmediate [as _immediateCallback] (timers.js:611:5)
error: [utils/worker.js] 5a27a822cb569b2db8bc493d Error: invalid signature: 0x83268e0
error: [utils/worker.js] 5a27a822cb569b2db8bc493d: errored
zip stream error
{ Error: unexpected end of file
    at Zlib._handle.onerror (zlib.js:370:17) errno: -5, code: 'Z_BUF_ERROR' }

我搜索了很多实际可行的库,尝试了tree...
我感觉在NodeJs中没有处理zip文件的选项...
你能否驳斥我的看法?

1个回答

2
你需要递归解压缩存档。为此,已经有一个名为“runzip”的节点模块可用。Github链接:https://github.com/dherman/runzip 或者,你可以自己编写一个递归函数,在文件名上添加一个检查。

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