Как обновить часть файла атомарно? - PullRequest
0 голосов
/ 25 августа 2018

У меня большой файл (несколько гигабайт), и я хочу обновить в нем небольшой раздел (перезаписать несколько байтов новым значением). Это должно быть сделано атомарно (либо операция прошла успешно, либо файл остался без изменений). Как я могу это сделать?

Цель - сохранить информацию о прогрессе в файле, который занимает много времени для генерации / загрузки (это может быть в удаленной файловой системе). Вероятно, будут времена, когда мне нужно будет писать в разных местах файла (и фиксировать все изменения сразу), но при необходимости я могу переписать весь индекс, который является непрерывным блоком и относительно небольшим по сравнению с остальной частью файла. , В каждый момент времени в файл записывается только один процесс и поток.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Обычные диски не являются транзакционными и не гарантируют атомарность.Если базовая файловая система не обеспечивает атомарную запись (а большинство из них не обеспечивает), то вам необходимо создать атомарность в вашей собственной структуре приложения / данных.Это можно сделать с помощью журналирования (как это делают многие файловые системы и базы данных), техники копирования при записи и т. Д.

В Windows функция транзакционной файловой системы (TxF) делает именно то, что вам нужно, но вашаДля этого приложению необходимо явно использовать API-интерфейсы ввода-вывода Win32.

0 голосов
/ 25 августа 2018

Я думаю, что простого lockfile должно быть достаточно ...

Например, Proper-Lockfile :

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

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

Обратите внимание, что любая логика, работающая с some/file, имеетуважать lockfile.

...