为什么文件流功能没有结束

时间:2016-06-03 03:05:58

标签: javascript node.js

我编写了以下代码来创建文件的哈希:

function hashFile(filePath){
  try{
    // Setup hash
    var hash = crypto.createHash('sha256');
    hash.setEncoding('hex');

    // Setup filestream
    var fileStream = fs.createReadStream(filePath);
    fileStream.pipe(hash, { end: false });

    fileStream.on('end', function () {
      // Get the hash
      hash.end();
      var thisHash = String(hash.read());
    });
  }catch (err) {
    console.log( "Error thrown : " + err );
    return;
  }
}

这个工作得很好,直到我扔了一些较小的文件。当我这样做时,该功能就会挂起。 filestream.on('end')回调永远不会发生。

我把它重写为不使用createReadStream:

function hashFile(filePath){
  try{
    fs.readFile(filePath, function (err, data) {

      // Make the hash
      var thisHash = crypto
        .createHash('sha256')
        .update(data, 'utf8')
        .digest( 'hex');

        console.log(thisHash);
    });
  }catch (err) {
    console.log( "Error: " + err );
    return;
  }
}

这段代码运行得很好,除了它在几MB或更大的文件上速度非常慢。

我的问题是为什么第一个函数不能处理小文件?

1 个答案:

答案 0 :(得分:0)

所以在整个晚上寻找答案后,我在写完这篇文章后15分钟就知道了。 '结束'在调用管道之前需要配置回调:

var fileStream = fs.createReadStream(filePath);

var hash = crypto.createHash('sha256');
hash.setEncoding('hex');

fileStream.on('end', function () {
  hash.end();
  console.log(hash.read());
});

fileStream.pipe(hash);