Node.js - 无法删除使用 createWriteStream 创建并写入的文件

Node.js - Cannot delete file created with createWriteStream and written to

我找不到解决这个问题的方法。使用 Node fs,我使用 createWriteStream 创建了一个文件,将数据写入其中,然后尝试删除它,但是当节点打开时无法删除它。

以下是我在此过程中使用的代码:

var file = fs.createWriteStream("test.txt", {flags: "a");
file.write(new Buffer(1048576));

文件创建成功,1MB空数据正确写入。问题是当我尝试 fs.unlink 文件或手动删除它(Windows - 删除文件)时,它从文件夹中消失但是一旦我刷新文件夹文件仍然存在,它总是存在直到节点关闭。我认为一旦 Node 不再使用它,它就会被标记为删除。

我已经尝试在使用 file.close()file.end()file.emit("close")file.emit("end") 和其他几个程序后关闭文件,但仍然无法删除文件.

我如何 "finish" 文件以便在需要时可以将其删除?还以为写入后自己关闭了呢

要知道底层文件描述符何时关闭,您需要在调用 .end() 之后侦听 close 事件。例如:

var file = fs.createWriteStream("test.txt", {flags: "a");
file.on('close', function() {
  console.log('fd closed');
});
file.end(new Buffer(1048576));

唉,在尝试了不同的代码组合之后,我设法找到了一种正确关闭文件的方法,如果它没有像从 HTTP(s) get 请求将流数据通过管道传输到文件时那样自行关闭的话。

关闭文件的正确方法如下

fs.close(fd);

fd 是文件描述符,我花了一段时间才明白它的位置。我尝试使用我的代码示例中的 file 但它返回了错误

fd must be a file descriptor

最后我无意中发现了文件的文件描述符,它只是一个数字。您可以在您拥有的文件参考中找到它。就我而言,我所要做的就是

fs.close(file.fd);

大功告成,现在可以删除文件了。

如果有人需要,可以将回调用于第二个参数:https://nodejs.org/api/fs.html#fs_fs_close_fd_callback