什么可以使 writeStream 在不写入文件的情况下关闭?

What can make a writeStream to emit close without writing to file?

我想将文件块合并到另一个文件,但是 writeStream 正在发出关闭而没有将 readStream 内容写入或附加到输出文件。

我有一个 async 函数,它有一个循环遍历数组的 for-of 循​​环,在循环中我创建了一个 writableStream 标志写 truncate/write w如果迭代索引为 0 则标记,否则附加 w 然后创建一个 readStream 然后将其通过管道传输到 writeStream.


 async function mergeBlocks(op) {
  for (const [index, block] of op.blockObjects.entries()) {
    const flags = index === 0? 'w' : 'a'
    const w = createWriteStream(op.output, { start: block.start, flags }),
      r = createReadStream(block.path, { start: block.start, end: block.end })
    console.log(index)
    r.pipe(w)
    await new Promise(res =>
      w.on('finish', () => {
        console.log('close')
        res()
      })
    )
  }
}

但它只写入第一个块并关闭 writeStream,而不会在每隔一次迭代时写入输出文件。请问我做错了什么?

编辑检查下面的答案。

我设置为 createReadStream 选项的 startend 不是必需的 我只需要设置那些,如果我从文件中读取,只需设置第一个块将匹配块的开始和结束位置,这解释了为什么只有第一个块被写入文件而其他只是空内容。 至于代码,我最终使用了 promisify stream.pipeline,这进一步简化了我的代码。


async function mergeBlocks() {
  for (const [index, block] of op.blockObjects.entries()) {
    await pipeline(
      createReadStream(join(block.bucket, block.hash)),
      createWriteStream(op.output, { flags: index === 0 ? 'w' : 'a', start: block.start })
    )
  }
}