javascript - 外部修改文件会破坏 node.js 中的可写流

标签 javascript node.js file stream

我有一个简单的日志记录工具可以将日志数据写入磁盘,它的工作原理如下:

  1. 使用fs.createWriteStream创建一个可写流,并使用标志“a”进行追加。这将创建或打开文件供我写入数据。
  2. 使用 writeStream.write() 将数据写入我的日志文件。

除了以下两种情况之外,这完全有效:

  1. 我在应用程序运行时打开日志文件,更改某些内容,然后保存日志文件。
  2. 我在应用程序运行时删除日志文件。预期的行为是重新创建文件并继续注销。

在这两种情况下,我仍然可以毫无错误地调用 writeStream.write()

在应用程序运行时修改或删除日志文件后检查我的 writeStream 对象,显示 writeStream.writable 属性为 true。每次我调用 writeStream.write() 时,writelen 属性都会增加,这让我相信 writeStream 认为一切正常,即使它不是。

我的问题:

  1. 为什么在外部修改和保存我的日志文件会导致 writeStream.write() 停止向我的文件写入数据?我该如何修复它?
  2. 为什么从外部删除我的日志文件会导致 writeStream.write() 停止向我的文件写入数据?我该如何修复它?

最佳答案

就写入流而言,一切都很好。当您删除文件时,您实际上删除了目录中的一个条目,但原始 inode 并未被删除,并且打开该文件的应用程序会继续写入磁盘,只是您没有指向它的指针(目录条目),所以看不到。您会注意到可用磁盘空间不断减少,这告诉您确实已写入内容。当应用程序关闭文件时,它会被删除(因为没有任何引用指向它),此时可用磁盘空间将再次增加。

您尝试执行的标准做法是发送信号(SIGHUPSIGUSR1 到应用程序),并在信号处理程序中让应用程序关闭并重新打开文件。这称为“日志轮转”。有许多 Node 包可以为您执行此操作,或者您可以自己执行此操作以进行练习:-)

关于javascript - 外部修改文件会破坏 node.js 中的可写流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24919975/

相关文章:

c++ - 将大文件读入字符数组的正确方法

javascript - 抑制 PC 上的滑动事件

javascript - 语义UI react 文本区域onchange事件

javascript - 验证错误: "g-recaptcha-response" is not allowed

mysql - ORM 使用什么?

javascript - 如何在 Bamboo CI 中运行 Protractor

C 读/写和清除 FILE

java - 在 javascript 中处理 POJO

java - 从字符串中删除除字母和数字以外的任何内容

c - Linux套接字编程: Socket writing line to a file in c