如何以原子方式更新文件的一部分?

How to update part of a file atomically?

我有一个大文件(几千兆字节),我想更新其中的一小部分(用新值覆盖一些字节)。这必须以原子方式完成(要么操作成功,要么文件保持不变)。我该怎么做?

目的是将进度信息存储在需要花费大量时间的文件中generate/upload(它可以在远程文件系统上)。有时我需要在文件的不同位置写入(并一次提交所有更改),但如果需要我可以重写整个索引,这是一个连续的块,与文件的其余部分相比相对较小.在任何给定时间只有一个进程和线程写入文件。

我认为简单的锁文件就足够了...

例如proper-lockfile:

const lockfile = require('proper-lockfile');

lockfile.lock('some/file')
  .then(() => doStuff())
  .finally(() => lockfile.unlock('some/file'));

请注意,任何使用 some/file 的逻辑都必须遵守 lockfile

普通磁盘不是事务性的,也不提供原子性保证。 如果底层文件系统不提供原子写入(其中大部分不提供),那么您需要在自己的 application/data 结构中创建原子性。这可以通过日志记录(如许多文件系统和数据库所做的那样)、写时复制技术等来完成。

在 Windows 中,事务文件系统 (TxF) 功能完全可以满足您的需求 - 但您的应用程序需要明确使用 Win32 事务文件 I/O API 来执行此操作。