在执行fs.writeFile之前,我需要检查文件是否存在,所以如果文件已经存在,fs.writeFile就不会替换该文件。但是文件上写着:
不建议使用
fs.stat()在调用fs.open()、fs.readFile()或fs.writeFile()之前检查文件是否存在。相反,用户代码应该直接打开/读/写文件,并在文件不可用时处理引发的错误。
如果我直接调用fs.writeFile,如果文件已经存在,该函数将替换它,error变量将是null。
如果文件已经存在,我想忽略对fs.writeFile的调用。
谢谢。
发布于 2017-08-26 17:23:14
如果文件已经存在,我想忽略对
fs.writeFile的调用。
使用wx标志(有文档的这里):
类似
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.open/fs.writeFile/fs.readFile之前使用fs.stat的原因是由于固有的竞争条件:在调用fs.stat和(例如) fs.writeFile之间,可以创建一个文件的时间窗口很小,即使在调用fs.stat时它还不存在。因此,fs.writeFile仍有可能覆盖现有的文件。
如果使用文件标志,就会原子地检查是否存在。
发布于 2017-08-26 17:49:55
Robert有正确的答案(只需传递适当的标志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进程),但是无论如何,始终以安全的方式编写代码是更安全的,而且实际上,安全的方式也是较少的代码。
https://stackoverflow.com/questions/45897074
复制相似问题