Поддерживать файл (в файловой системе), содержащий текущее состояние быстро меняющегося объекта, на удивление сложно.В частности, настройка таким образом, чтобы какая-то другая программа могла прочитать файл в любое время, является сложной частью.Зачем?В любой момент файл может быть в процессе записи, поэтому читатель может получить противоречивые результаты.
Вот схема хорошего способа сделать это.
1) запишите файлреже, чем каждый раз, когда состояние меняется.Всякий раз, когда состояние меняется, звоните updateFile (myObj)
.Он устанавливает таймер, скажем, на 500 мс, а затем записывает самое последнее состояние в файл по истечении таймера.Примерно так: не отлажено:
let latestObj
let updateFileTimer = 0
function updateFile (myObj) {
latestObj = myObj
if (updateFileTimer === 0) {
updateFileTimer = setTimeout (
function () {
/* write latestObj to the file */
updateFileTimer = 0
}, 500)
}
}
Это записывает в файл последнее состояние вашего объекта, но не чаще, чем каждые 500 мс.
Внутри этой функции тайм-аута запишите временный файл.Когда он написан, удалите существующий файл и переименуйте временный файл, чтобы получить имя существующего файла.Сделайте все это асинхронно, чтобы остальной части вашей программы не пришлось ждать, пока файловая система заработает.Ваша функция тайм-аута будет выглядеть следующим образом
updateFileTimer = setTimeout (
function () {
/* write latestObj to the file */
fs.writeFile("file.json.tmp",
JSON.stringify(myObj),
function (err) {
if (err) throw err;
fs.unlink ( "file.json",
function (err) {
if (!err)
fs.renameSync( "file.json.tmp", "file.json")
} )
} )
updateFileTimer = 0
}, 500)
Есть еще одна вещь, о которой нужно беспокоиться.Между операциями unlink
и renameSync
существует короткий промежуток времени, когда файл "file.json" не существует в файловой системе.Итак, любая программа, которую вы пишете, которая ЧИТАЕТ "file.json", должна повторить попытку, если файл не найден.
Если вы используете Linux, MacOs, FreeBSD или другую производную от UNIX операционную систему для этого кода, он будет работать хорошо.Файловые системы этих операционных систем позволяют одной программе отсоединять файл, в то время как другая программа читает его.Если вы используете его в операционной системе, основанной на DOS, такой как Windows, операция отмены связи завершится неудачно, когда другая программа читает файл.