Как правильно удалить потенциально занятый файл в NodeJS? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть сервер NodeJS, управляющий некоторыми файлами. Он будет наблюдать за известным именем файла от внешнего процесса и, как только получит, прочитает его и затем удалит его. Однако иногда его пытаются прочитать / удалить до того, как файл будет «разблокирован» от предыдущего использования, поэтому, скорее всего, время от времени произойдет сбой. Что я хотел бы сделать, так это как можно скорее повторить попытку файла, либо сразу после его завершения, либо непрерывно в быстром темпе.

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

fs.watchFile(intput_json_file, {interval: 10}, function(current_stats, previous_stats) {

                var json_data = "";
                try {
                    var file_cont = fs.readFileSync(input_json_file); // < TODO: async this
                    json_data = JSON.parse(file_cont.toString());
                    fs.unlink(input_json_file);
                } catch (error) {
                    console.log("The JSON in the could not be parsed. File will continue to be watched.");
                    console.log(error);
                    return;
                }

                // Else, this has loaded properly.
                fs.unwatchFile(input_json_file);

                // ... do other things with the file's data.

}


// set a timeout for the file watching, just in case
setTimeout(fs.unwatchFile, CLEANUP_TIMEOUT, input_json_file);

Я ожидаю «EBUSY: ресурс занят или заблокирован» иногда появляется, но fs.watchFile не всегда вызывается, когда файл разблокирован.

Я думал о создании функции и последующем ее вызове с задержкой в ​​1-10 мс, где она могла бы вызываться сама, если это тоже не удается, но это похоже на быстрый путь к ... кашель переполнение стека.

Я также хотел бы избежать синхронных методов, чтобы они хорошо масштабировались, но, будучи относительно новым для NodeJS, все обратные вызовы начинают превращаться в лабиринт.

1 Ответ

0 голосов
/ 29 мая 2019

Может быть, для этой истории все будет кончено, но вы можете создавать собственные fs с полным контролем. В этом случае другие программы будут записывать данные непосредственно в вашу программу. Просто выполните поиск по слову fuse и fuse-binding

...