如何在节点js中处理文件读写?

时间:2015-04-10 18:10:45

标签: node.js asynchronous file-io

让我说我正在编写并在节点js中读取相同的文件。如何处理数据完整性?我们在节点js中有锁或互斥吗?还是内部处理?

fs.writeFile("test1", "Hey there! Really large data", function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 


fs.readFile('test1', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

3 个答案:

答案 0 :(得分:0)

node.js中没有互斥锁或锁,因为它是单线程的。我通常读取文件然后写它的方式是这样的:

function copyFile(source, target){

    var done = function(err){
        console.log(err);
    };


    var rd = fs.createReadStream(source);
    rd.on("error", function(err){
        done(err);
    });

    var wr = fs.createWriteStream(target);
    wr.on("error", function(err){
        done(err);
    };
    rd.pipe(wr);
}

答案 1 :(得分:0)

节点文件系统文档将操作描述为:

  

文件I / O由标准POSIX函数的简单包装提供

node file code中没有锁/互斥锁,因此操作系统或程序员有责任处理读/写的一致性。 实际上,由于节点是单线程的,所以锁或互斥锁的使用确实没有帮助,因此无法同时调用这些调用。

总是有一个选项,虽然不推荐,但是使用同步版本的调用来保证读/写顺序。

答案 2 :(得分:0)

文件锁定仍然是节点的问题(从版本11开始)

假设您正在写计数器:

----------------------------------
2018-10-31 18:34:05.0000000 +00:00

在读取计数器文件之前,您需要在其上放置一个锁(或等待它),以确保不会覆盖另一个异步请求。

npm上的文件锁定模块令人惊讶,每周有数百万的下载量无法处理真正的并发或根本无法工作。

有关描述,请参见Alex Mills博客:https://medium.com/@the1mills/a-better-mutex-for-node-js-4b4897fd9f11

他还提供了一个软件包来补救:https://github.com/ORESoftware/live-mutex 不幸的是,它利用TCP套接字进行操作,从而带来了所有复杂性。

我仍在寻找使用fcntl咨询文件锁定或另一种保证原子锁定的机制的工作包。 (符号链接)