代码之家  ›  专栏  ›  技术社区  ›  Hamza

使用fs。stat和fs。可写文件

  •  0
  • Hamza  · 技术社区  · 7 年前

    fs.writeFile ,因此如果文件已经存在, fs。可写文件

    使用 fs.stat() fs.open() , fs.readFile() fs.writeFile() 不建议使用。相反,用户代码应该直接打开/读取/写入文件,并在文件不可用时处理引发的错误。

    fs。可写文件 error 变量将为 null .

    我想忽略呼叫 如果文件已存在。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   robertklep    7 年前

    我想忽略呼叫 fs.writeFile

    使用 wx 标志(已记录 here

    wx公司 -就像 'w'

    fs.writeFile('/path/to/file', data, { flag : 'wx' }, function(err) {
      if (err && err.code === 'EEXIST') {
        console.log('file already exists, not overwriting');
        return;
      }
      ...
    })
    

    编辑 :不建议使用的原因 fs.stat 之前 fs.open/fs.writeFile/fs.readFile fs。斯达 和(说) ,有一个小的时间窗口 创建,即使它在 已调用。所以仍然有机会 fs。可写文件

    如果使用文件标志,则会自动检查是否存在。

        2
  •  2
  •   jfriend00    7 年前

    fs.writeFile(fname, data, { flag : 'wx' }, ...) ),但我想我会解释为什么不建议使用它 fs.stat() 然后 fs.writeFile()

    fs.stat(fname, function(err) {
        if (err) {
           // in the bit of time right here, there is a race condition
           fs.writeFile(fname, data, function(err) {
               // file written
           });
        }
    });
    

    这是一个比赛条件。在任何类型的多进程系统或与其他系统共享的任何类型的文件系统中,都可能出现以下情况: fs。stat() fs。writeFile() ,其他进程或线程或计算机写入该文件,现在您刚刚覆盖了一个现有文件,这是您不想做的事情。因此,在某些情况下,这根本不可靠,因此不建议这样做。

    通过传递 wx fs。writeFile() ,您告诉底层操作系统仅当文件不存在时才将这些字节写入文件,并且将以原子方式完成,不存在多线程/进程/计算机竞争条件。


    竞争条件是有限制的,在某些情况下,您的系统实际上不会受到限制(只有一个node.js进程可以写入该文件),但无论发生什么情况,始终以安全的方式编码更安全,事实上,安全的方式也是更少的代码。