我正在创建一个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 +'); ...
[如果您要使用fs.promises.open()
打开文件,那么您将获得较新的FileHandle
对象(不是常规文件描述符),并且需要像fileHandle.close()
中那样对该对象调用close,而不是[ C0]。