gpt4 book ai didi

node.js - 如何在异步写入文件时锁定文件

转载 作者:搜寻专家 更新时间:2023-10-31 23:41:36 26 4
gpt4 key购买 nike

我有两个 Node 线程在运行,一个负责监视文件消耗的目录,另一个负责将文件写入给定目录。

通常它们不会在同一个目录上运行,但对于我正在处理的极端情况,它们会是。

似乎消费应用程序在文件完全写入之前抓取文件,导致文件损坏。

有什么方法可以锁定文件直到写入完成?我研究了 lockfile 模块,但遗憾的是我认为它不适用于这个特定的应用程序。

=====

完整的代码放在这里意义不大,但它的要点是:

  1. 应用分离出观察者和听者

听众:

  • 监听正在添加到数据库中的文件,使用 fs.writeFile 导出它

观察者:

  • watcher 使用 chokidar 跟踪每个被监视目录中添加的文件
  • 当找到 fs.access 时调用以确保我们可以访问该文件
    • fs.access 似乎对正在写入的文件不感兴趣
  • 文件通过 fs.createReadStream 使用,然后发送到服务器
    • filestream 是必需的,因为我们需要文件哈希

在这种情况下,文件被导出到监视目录,然后重新导入通过观察过程。

最佳答案

我会使用 proper-lockfile为了这。您可以指定重试次数或使用重试配置对象来使用指数退避策略。这样您就可以处理两个进程需要同时修改同一个文件的情况。

这是一个带有一些重试选项的简单示例:

const lockfile = require('proper-lockfile');
const Promise = require('bluebird');
const fs = require('fs-extra');
const crypto = require('crypto'); // random buffer contents

const retryOptions = {
retries: {
retries: 5,
factor: 3,
minTimeout: 1 * 1000,
maxTimeout: 60 * 1000,
randomize: true,
}
};

let file;
let cleanup;
Promise.try(() => {
file = '/var/tmp/file.txt';
return fs.ensureFile(file); // fs-extra creates file if needed
}).then(() => {
return lockfile.lock(file, retryOptions);
}).then(release => {
cleanup = release;

let buffer = crypto.randomBytes(4);
let stream = fs.createWriteStream(file, {flags: 'a', encoding: 'binary'});
stream.write(buffer);
stream.end();

return new Promise(function (resolve, reject) {
stream.on('finish', () => resolve());
stream.on('error', (err) => reject(err));
});
}).then(() => {
console.log('Finished!');
}).catch((err) => {
console.error(err);
}).finally(() => {
cleanup && cleanup();
});

关于node.js - 如何在异步写入文件时锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com