Javascript 无法流式传输到未链接的文件

Javascript 无法流式传输到未链接的文件,javascript,node.js,Javascript,Node.js,我正在创建一个系统,需要在短时间内缓存一个文件,然后将其删除。我遇到了一个错误,如果我试图在删除后缓存同一个删除的文件,我会得到一个权限错误 我复制了我的问题,看起来是这样的: //@ts-check const fs = require("fs") const promisify = require("util").promisify const unlink = promisify(fs.unlink) const SOURCE = "a.txt" const DESTINATION =

我正在创建一个系统,需要在短时间内缓存一个文件,然后将其删除。我遇到了一个错误,如果我试图在删除后缓存同一个删除的文件,我会得到一个权限错误

我复制了我的问题,看起来是这样的:

//@ts-check
const fs = require("fs")
const promisify = require("util").promisify
const unlink = promisify(fs.unlink)

const SOURCE = "a.txt"
const DESTINATION = "b.txt"

function init() {
  console.info("Running operation")

  const sourceStream = fs.createReadStream(SOURCE)
  const destinationStream = fs.createWriteStream(DESTINATION)

  sourceStream.on("close", async () => {
    await unlink(DESTINATION)
    init()
  })

  sourceStream.pipe(destinationStream)
}

init()
运行时,这是记录到控制台的内容:

Running operation
Running operation
Running operation
events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: EPERM: operation not permitted, open 'D:\Projects\test\b.txt'
Emitted 'error' event at:
    at WriteStream.onerror (_stream_readable.js:690:12)
    at WriteStream.emit (events.js:182:13)
    at lazyFs.open (internal/fs/streams.js:273:12)
    at FSReqWrap.oncomplete (fs.js:141:20)
更奇怪的是,在抛出错误之前,它可以运行相同操作的次数是不同的。有时3点后会失败,有时5点后会失败


那么这里发生了什么呢?

如果我没弄错问题,也许你应该看看事件

更改此项:

const sourceStream = fs.createReadStream(SOURCE)
const destinationStream = fs.createWriteStream(DESTINATION)

sourceStream.on("close", async () => {
  await unlink(DESTINATION)
  init()
})

sourceStream.pipe(destinationStream)
为此:

const sourceStream = fs.createReadStream(SOURCE)
const destinationStream = fs.createWriteStream(DESTINATION)

sourceStream.pipe(destinationStream)
   .on('finish', async () => {
     await unlink(DESTINATION);
     console.log('Done');
     init()
   })

在再次阅读之前,您需要等待destinationStream结束。尝试这样做:

 destinationStream.on("close", async () => {
      await unlink(DESTINATION)
      init()
 })

完成事件从不激发。是否完全确定未激发完成事件?因为它在我的电脑上工作。另外,您使用的node.js版本是什么?它不会启动。它运行该操作一次,然后退出。我使用的是v10.13.0。如果您想在循环中运行代码,只需添加函数调用。我已经编辑了我的响应并添加了
init()
,就像在您的示例中一样。我想让您知道,我从未删除过函数调用。我只是简单地将事件从“关闭”更改为“完成”。这样做有什么原因吗?我还能够将
取消链接
放在目标流的close事件中。谢谢。是的,destinationStream在sourceStream之后延迟关闭。很高兴你解决了。我会更新答案。