在Node.js中事务性地编写文件

我有一个Node.js应用程序,它将一些configuration数据存储在一个文件中。 如果更改某些设置,configuration文件将写入磁盘。

目前,我正在使用一个简单的fs.writeFile

现在我的问题是:当文件被写入时Node.js崩溃会发生什么? 有没有机会在磁盘上有损坏的文件? 或者Node.js保证文件是以primefaces方式写入的,以便旧版本或新版本有效?

如果没有,我怎么能实施这样的保证? 有没有这个模块?

       

网上收集的解决方案 "在Node.js中事务性地编写文件"

当文件被写入时Node.js崩溃会发生什么? 有没有机会在磁盘上有损坏的文件? 或者Node.js保证文件是以primefaces方式写入的,以便旧版本或新版本有效?

节点仅通过系统调用实现一个(精简)asynchronous封装,因此它不提供有关写入primefaces性的任何保证。 实际上, fs.writeAll重复调用fs.write直到写入所有数据。 你是正确的,当Node.js崩溃,你可能最终会有一个损坏的文件。

如果没有,我怎么能实施这样的保证? 有没有这个模块?

我能想到的最简单的解决scheme就是用于FTP上传的最简单的解决scheme:

  1. 将内容保存到具有不同名称的临时文件。
  2. 将内容写入磁盘时,将临时文件重命名为目标文件。

手册页说,重命名保证留下一个新path的实例 (在Unix系统,如Linux或OSX)。

fs.writeFile和fs模块中的所有其他方法一样,都是作为标准POSIX函数的简单包装实现的(正如文档中所述)。

在nodejs的代码中挖掘一下,可以看到fs.js (所有的包装器被定义在其中)使用fs.c作为其所有的文件系统调用。 更具体地说, write方法用于写入缓冲器的内容。 事实certificate,写入的POSIX规范明确指出:

primefaces/非primefaces:如果在一个操作中写入的全部数据不与来自任何其他进程的数据交错,则写入是primefaces的。 当有多个写入者将数据发送到一个阅读器时,这非常有用。 应用程序需要知道有多大的写请求可以预期primefaces执行。 这个最大值被称为{PIPE_BUF}。 IEEE Std 1003.1-2001的这一卷没有说明大于{PIPE_BUF}字节的写入请求是否是primefaces的,但是要求写入{PIPE_BUF}或更less的字节应该是primefaces的。

所以看起来写起来相当安全,只要缓冲区的大小小于PIPE_BUF即可。 这是一个与系统有关的常量,所以你可能需要在别的地方检查它。

写文件primefaces将做你所需要的。 它写入临时文件,然后重命名。 这很安全。