Обойти ошибку «EBUSY» в файловых операциях NodeJS - PullRequest
0 голосов
/ 27 октября 2019

У меня есть скрипт узла, который выполняется в течение нескольких дней до его завершения.

Во время работы этот скрипт создает и манипулирует многими файлами, используя следующие функции:

  • fs.writeFileSync
  • fs.appendFileSync

Я должен отметить, что файловые операции не являются узким местом в моем сценарии, поэтому использование этих методов "sync" - это осознанный выбор.

В какой-то случайный момент во время длительного выполнения этого скрипта он выдает следующее исключение:

Error: (node:13308) UnhandledPromiseRejectionWarning: Error: EBUSY: resource busy or locked, open '...'
    at Object.openSync (fs.js:443:3)
    at Object.writeFileSync (fs.js:1194:35)
    at Object.appendFileSync (fs.js:1240:6)

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

Предполагая, что это действительно так, и что другой процесс" отпускает "файлаЧерез некоторое время я решил обойти эту проблему следующим образом:

Сначала я заменил const fs = require("fs"); на const fs = require("./fs");.

Затем я добавил файл fs.js:

const fs = require("fs");

for (const funcName of ["writeFileSync", "appendFileSync"]) {
    module.exports[funcName] = function(fileName, ...args) {
        while (true) {
            try {
                return fs[funcName](fileName, ...args);
            }
            catch (error) {
                console.log(error.message);
            }
        }
    };
}

IЯ проверил, работает ли этот код.

Однако я очень неохотно использую этот патч, потому что он не кажется правильным.

Возможно, у вас есть какие-либо предложенияо том, как справиться с этим?

Моя ОС - Windows 10.

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...