Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点gzip将文件解压缩到变量中_Javascript_Node.js_Gzip - Fatal编程技术网

Javascript 节点gzip将文件解压缩到变量中

Javascript 节点gzip将文件解压缩到变量中,javascript,node.js,gzip,Javascript,Node.js,Gzip,我使用gzip压缩json字符串,然后将其保存到如下文件中: fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => { var gzip = zlib.createGzip(); var inp = fs.createReadStream(`${craneProjectDir}/tree.out`); var out = fs.createWriteSt

我使用gzip压缩json字符串,然后将其保存到如下文件中:

fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
    var gzip = zlib.createGzip();
    var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
    var out = fs.createWriteStream(`${craneProjectDir}/tree`);
    inp.pipe(gzip).pipe(out);
    fs.unlinkSync(`${craneProjectDir}/tree.out`);
});
它似乎可以工作,因为它创建了文件,但我不确定,因为我无法将其读回变量。这是我尝试过的:

var treeStream = fs.createReadStream(`${craneProjectDir}/tree`);
zlib.unzip(treeStream, (err, buffer) => {
    if(err){
        connection.console.log((util.inspect(err, false, null)));
    }
    workspaceTree = JSON.parse(buffer.toString());
});
我得到以下错误:

[TypeError:无效的非字符串/缓冲区区块]


问题可能是您在将内容完全写入磁盘之前删除了源文件

fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
    var gzip = zlib.createGzip();
    var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
    var out = fs.createWriteStream(`${craneProjectDir}/tree`);
    inp.pipe(gzip).pipe(out).on('close', function () {;
      fs.unlinkSync(`${craneProjectDir}/tree.out`);
    });
});
注意系紧,不要系紧。close表示底层文件描述符已关闭,end表示流已完成数据处理

提取新文件时,您犯了两个错误

  • 您使用了zlib.unzip,但内容是gzip,因此必须使用gunzip方法之一
  • 您使用了zlib.unzip,它需要一个缓冲区,但您向它发送了一个流
要压缩内容

  var d = '';
  fs.createReadStream(`${craneProjectDir}/tree`)
  .pipe(zlib.createGunzip())
  .on('data', function (data){
    d += data.toString()
  })
  .on('end', function (){
    console.log(d);
  })

顺便说一句,我想你不需要这个临时文件;)

我发现我可以使用readFile,并将其内容放入缓冲区,如下所示:

fs.readFile(`${craneProjectDir}/tree`, (err, data) => {
    var treeStream = new Buffer(data);
    zlib.unzip(treeStream, (err, buffer) => {
        if (err) {
            connection.console.log((util.inspect(err, false, null)));
        }
        workspaceTree = JSON.parse(buffer.toString());
        notifyClientOfWorkComplete();
    });
});

由于
fs
操作是异步的,因此可能是在您尝试读取文件之前,该文件尚未完成编写。是的,我发现您使用了混合流/缓冲区、gzip/unzip。我会更新我的答案。实际上我发现我可以使用
fs.readFile
并将内容放入
new Buffer()
当您使用gzip时,应该使用gunzip(zlib.gunzip(buf[,options],callback))。不知道为什么它与zlib.unzip一起工作。