Как эффективно заблокировать текстовый файл при использовании его в NodeJS?

У меня есть несколько независимых скриптов для чтения и записи из одних и тех же текстовых файлов. Я пытаюсь заблокировать текстовые файлы, пока модуль читает / пишет из них. В данный момент я использую пакет lockfile, но он не работает. например

//lock file before reading

lockFile.lockSync("./Config/presetString.txt.lock",10000,100,10000,1000,100)

//read file

var preset = fs.readFileSync("./Config/presetString.txt", 'utf8');

//unlock file

lockFile.unlockSync("./Config/presetString.txt.lock",10000,100,10000,1000,100)

Однако, когда запущено много модулей, иногда выдается ошибка, которая останавливает все. В сообщении об ошибке указано, что файл.lock уже существует. Это кажется нелогичным - если файл.lock уже существует, то модули должны подождать, пока он не будет существовать. С указанными выше параметрами модули должны повторить попытку доступа к блокировке 1000 раз, но это, похоже, не работает.

Есть идеи как это предотвратить?

Вот пример ошибки, которая выдается:

Error: EEXIST: file already exists, open './Config/presetString.txt.lock'

1 ответ

Из документации

Методы синхронизации возвращают значение / выдают ошибку, другие нет. Стандартный узел fs вещи.

Вам необходимо проверить существующую блокировку и использовать обратный вызов

 // opts is optional, and defaults to {}
lockFile.lock('some-file.lock', opts, function (er) {
   // if the er happens, then it failed to acquire a lock.
   // if there was not an error, then the file was created,
   // and won't be deleted until we unlock it.

  //read file

   var preset = fs.readFileSync("./Config/presetString.txt", 'utf8');

   // do my stuff, free of interruptions
   // then, some time later, do:
lockFile.unlock('some-file.lock', function (er) {
   // er means that an error happened, and is probably bad.
   })
})

Я обнаружил, что fs-ext работает отлично и ДЕЙСТВИТЕЛЬНО выполняет флок!

npm install fs-ext

JavaScript:

Процесс 1

const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('file.txt', 'w');
flockSync(fd, 'ex');

Процесс 2

const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('file.txt', 'r');
flockSync(fd, 'sh'); // PENDING until Process 1 release exclusive lock!
Другие вопросы по тегам