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之后延迟关闭。很高兴你解决了。我会更新答案。