首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fs.stat和fs.writeFile

使用fs.stat和fs.writeFile
EN

Stack Overflow用户
提问于 2017-08-26 15:38:45
回答 2查看 841关注 0票数 0

在执行fs.writeFile之前,我需要检查文件是否存在,所以如果文件已经存在,fs.writeFile就不会替换该文件。但是文件上写着:

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

如果我直接调用fs.writeFile,如果文件已经存在,该函数将替换它,error变量将是null

如果文件已经存在,我想忽略对fs.writeFile的调用。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-26 17:23:14

如果文件已经存在,我想忽略对fs.writeFile的调用。

使用wx标志(有文档的这里):

类似wx'w',但如果路径存在,则失败。

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

编辑:不建议在fs.open/fs.writeFile/fs.readFile之前使用fs.stat的原因是由于固有的竞争条件:在调用fs.stat和(例如) fs.writeFile之间,可以创建一个文件的时间窗口很小,即使在调用fs.stat时它还不存在。因此,fs.writeFile仍有可能覆盖现有的文件。

如果使用文件标志,就会原子地检查是否存在。

票数 2
EN

Stack Overflow用户

发布于 2017-08-26 17:49:55

Robert有正确的答案(只需传递适当的标志fs.writeFile(fname, data, { flag : 'wx' }, ...)),但我想解释一下为什么不建议使用fs.stat()fs.writeFile()。当你这样做的时候:

代码语言:javascript
复制
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进程),但是无论如何,始终以安全的方式编写代码是更安全的,而且实际上,安全的方式也是较少的代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45897074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档