Как эффективно заблокировать текстовый файл при использовании его в 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!