【问题标题】:Node.js - Cannot delete file created with createWriteStream and written toNode.js - 无法删除使用 createWriteStream 创建并写入的文件
【发布时间】:2023-04-05 07:14:01
【问题描述】:

我找不到任何解决此问题的方法。使用 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") 和其他一些人的过程后关闭文件,但仍然无法删除文件。

如何“完成”文件以便在需要时将其删除?我以为它在被写入后会自行关闭。

【问题讨论】:

    标签: javascript node.js filesystems


    【解决方案1】:

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

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

    【讨论】:

    • 已经试过了,还是不行。幸运的是,我能够找到解决问题的方法并已经发布了答案。尽管如此,还是感谢您的帮助。
    【解决方案2】:

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

    关闭文件的正确方法如下

    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

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2016-07-12
      相关资源
      最近更新 更多