Node.js-使用多个流正确关闭fd

问题描述 投票:0回答:1

我正在创建一个append / rw文件(取决于是否恢复下载)

this.syncFile = await fs.promises.open(this.syncPath, 'a+');
this.syncFile = await fs.promises.open(this.syncPath, 'r+');

稍后我为该FD创建写流

let writeStream = fs.createWriteStream(null, {fd:this.syncFile.fd, autoClose:false, highWaterMark: 1024*1024});

下载剩余数据后,我可能会或可能不会为同一FD创建readStream来计算完整文件的校验和

let readStream = fs.createReadStream(null, {fd:this.syncFile.fd, autoClose:false, highWaterMark: 1024*1024, start:0});

最后敲定,我想关闭FD。

fs.closeSync(this.syncFile.fd);

我已经尝试过在readStream / writeStream上使用close()或dispose()进行多种组合我不断收到未捕获的异常

[Window Title]
Error
[Content]
Uncaught Exception:
Error: EBADF: Closing file descriptor 5 on garbage collection failed, close

或有关在gc上关闭文件描述符的控制台警告总是连续两行,有时后跟

Error: EBADF: bad file descriptor, write

为什么会这样?读/写流具有选项autoClose:true同样,以前,当我只有一个writeStream时,某些无法重新创建的组合有效。

在这种情况下,关闭所有流和FD的正确方法是什么?我不能等待GC关闭文件描述符,因为它对文件(我要更改其属性的文件)持有排他锁(child_process.execSync('attrib -h +r "' + this.finalPath + '"');)同样,该文件在触发GC之前不能被其他程序使用。

如果我只做

delete this.syncFile;我收到[]的美丽垃圾邮件

(node:25180) Warning: Closing file descriptor 10 on garbage collection
(node:25180) Warning: Closing file descriptor 10 on garbage collection
(node:25180) Warning: Closing file descriptor 8 on garbage collection
(node:25180) Warning: Closing file descriptor 8 on garbage collection
(node:25180) Warning: Closing file descriptor 7 on garbage collection
(node:25180) Warning: Closing file descriptor 7 on garbage collection
(node:25180) Warning: Closing file descriptor 9 on garbage collection
(node:25180) Warning: Closing file descriptor 9 on garbage collection

但是没有例外,无论是否处理,但是由于上面列出的问题,这仍然不够好。我唯一的选择似乎是强制进行GC收集?

我正在创建一个append / rw文件(取决于是否恢复下载)this.syncFile =等待fs.promises.open(this.syncPath,'a +'); this.syncFile =等待fs.promises.open(this.syncPath,'r +'); ...

node.js filesystems file-descriptor
1个回答
1
投票

[如果您要使用fs.promises.open()打开文件,那么您将获得较新的FileHandle对象(不是常规文件描述符),并且需要像fileHandle.close()中那样对该对象调用close,而不是[ C0]。

© www.soinside.com 2019 - 2024. All rights reserved.