什么可以使 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
选项的 start
和 end
不是必需的 我只需要设置那些,如果我从文件中读取,只需设置第一个块将匹配块的开始和结束位置,这解释了为什么只有第一个块被写入文件而其他只是空内容。
至于代码,我最终使用了 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 })
)
}
}
我想将文件块合并到另一个文件,但是 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
选项的 start
和 end
不是必需的 我只需要设置那些,如果我从文件中读取,只需设置第一个块将匹配块的开始和结束位置,这解释了为什么只有第一个块被写入文件而其他只是空内容。
至于代码,我最终使用了 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 })
)
}
}