节点的JS是asynchronous读/写安全?

可能是一个愚蠢的问题,但是如果程序asynchronous地写入文件,并且在文件还在写入的时候访问该文件,那么内容是否会混淆?

事实上,你是同步还是asynchronous访问一个文件并不重要:如果其他进程(你或别人)在你正在读的过程中修改这个文件,你将得到不一致的结果。

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

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

  • 在飞行中的阅读将提前停止(没有错误),这意味着您将只有原始文件的百分比。
  • 在写入开始之后开始读取将读取最后写入的字节。 根据写入的速度和速度,以及如何读取文件,读取可能会看到或不看到完整的文件。

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

无论您是使用stream(即createReadStream ), readFile ,还是使用readFile ,都是如此。 当节点正在将文件caching到内存中时,磁盘上文件的任何部分都可以被更改。 (唯一值得注意的例外是,如果在同一个进程中使用writeFileSync ,然后使用readFileSync ,因为写入调用将阻止读取操作直到写入完成。但是,这仍然不能阻止其他进程更改文件中读,而且你不应该使用同步方法。)

换句话说,读取和写入文件是非primefaces的。 为了避免不一致,您应该使用临时名称编写文件,然后在写入完成后对其进行rename