可能是一个愚蠢的问题,但是如果程序是异步写入文件,并且在它仍然在写的时候访问该文件,那么内容是否搞砸了?
答案 0 :(得分:3)
实际上,无论您是同步还是异步访问文件都无关紧要:如果您正在阅读过程中某些其他进程(您或其他人)修改了该文件,您将得到不一致的结果。
您看到的确切类型的不一致取决于文件的编写方式和开始阅读的时间。
在节点的默认mode(w
)中,文件打开时会截断文件的现有内容。
如果文件是以r+
模式写入的,则打开文件进行写入时不会截断内容。这意味着读取将看到部分旧数据和部分新数据。如果写入更改文件大小,事情就会变得更加混乱。
无论您使用流(即createReadStream
),readFile
还是readFileSync
,都是如此。当节点正在将文件缓冲到内存中时,可以更改磁盘上文件的任何部分。 (这里唯一值得注意的例外是,如果您在同一进程中使用writeFileSync
然后readFileSync
,因为写入调用将阻止读取开始直到写入完成但是,这仍然不能防止其他进程在读取过程中更改文件,并且您不应该使用同步方法。)
换句话说,读取和写入文件是非原子的。为避免不一致,您应该使用临时名称编写文件,然后在写入完成时编写rename
。