代码之家  ›  专栏  ›  技术社区  ›  youen

如何原子地更新文件的一部分?

  •  2
  • youen  · 技术社区  · 8 年前

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

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   M.A. Hanin    8 年前

    普通磁盘不是事务性的,也不提供原子性保证。 如果底层文件系统不提供原子写操作(而且大多数都不提供),那么您需要在自己的应用程序/数据结构中创建原子性。这可以通过日志记录(正如许多文件系统和数据库所做的那样)、写时拷贝技术等来完成。

    在Windows中,事务性文件系统(Transactional File System,TxF)功能正好满足您的需要,但是您的应用程序需要显式地使用Win32事务性文件I/oapi来实现这一点。

        2
  •  0
  •   m1ch4ls    8 年前

    我觉得简单的锁文件就足够了。。。

    例如 proper-lockfile :

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

    注意,任何与 some/file lockfile