Node JS 异步 Read/Write 安全吗?

Node JS is async Read/Write safe?

可能是个愚蠢的问题,但如果程序正在异步写入文件,而您在文件仍在写入时访问该文件,内容是否搞砸了?

事实上,无论您是同步还是异步访问文件都没有关系:如果其他进程(您的或其他人的)在您正在读取文件时修改了文件,您将得到不一致的结果。

您将看到的不一致的确切类型取决于文件的写入方式和读取开始时间。

在节点的默认 mode (w) 中,文件的现有内容在打开文件时被截断。

  • 进行中的读取会提前停止(不会出错),这意味着您将只有原始文件的一部分。
  • 写入开始后开始的读取将读取到最后写入的字节。根据写入的距离和速度以及您读取文件的方式,读取可能会或可能不会看到完整的文件。

如果文件是以r+模式写入的,当文件打开写入时,内容不会被截断。这意味着读取将看到部分旧数据和部分新数据。如果写入更改文件大小,事情会变得更加混乱。

无论您是否使用流(即 createReadStream)、readFile 甚至 readFileSync,这都是正确的。当节点正在将文件缓冲到内存中时,磁盘上文件的任何部分都可以更改。 (这里唯一值得注意的例外是如果您在同一进程中使用 writeFileSync 然后 readFileSync ,因为写入调用会阻止读取在写入已完成。但是,这仍然不能阻止其他进程在读取过程中更改文件,并且您无论如何都不应该使用同步方法。)

换句话说,读写文件是非原子的。为避免不一致,您应该使用临时名称写入文件,然后在写入完成后 rename 它。