我注意到官方节点文档说的是关于fs.exists
的一些令人吃惊的事情:
“fs.exists()是一种时代错误,只是出于历史原因而存在。 几乎没有理由在你自己的代码中使用它。
特别是,在打开文件之前检查文件是否存在是一个 让你容易受到竞争条件影响的反模式:另一种 进程可能会在调用fs.exists()和之间删除文件 fs.open()。只需打开文件并处理错误即可 有“。
我理解这个建议,打开一个文件然后处理错误,如果它不存在,但我不明白的是为什么不推荐使用该接口而不是简单地改变实现。
任何人都可以向我解释为什么检查文件的存在是否与fs.exists
一样简单和逻辑的API是一件坏事,它应该被称为反模式并从节点中删除API?
答案 0 :(得分:8)
不需要使用fs.stat(),因为fs.existsSync()尚未弃用。
https://nodejs.org/api/fs.html#fs_fs_existssync_path
<强> fs.existsSync(路径)强>
添加于:v0.1.21 路径| fs.exists()的同步版本。如果文件存在则返回true,否则返回false。
请注意, fs.exists()已弃用,但fs.existsSync()不是。 (fs.exists()的回调&gt;参数接受与其他&gt; Node.js回调不一致的参数.ffsexistsSync()不使用回调。)
答案 1 :(得分:7)
我认为这是因为它是多余的。您可以尝试打开文件来检查文件是否存在。如果它不存在,它会给你ENOENT
:
> fs.open('foo', 'r', function(err, fd) {
... console.log(err, fd);
...
})
undefined
> { [Error: ENOENT, open 'foo'] errno: 34, code: 'ENOENT', path: 'foo' } undefined
答案 2 :(得分:4)
因为你引用了第二段。
检查文件是否存在没有意义,因为在检查后它总是可以删除。
答案 3 :(得分:4)
被弃用,因为根据某些人的说法,这是一种反模式。即信任 exists()然后对文件执行某些操作是不安全的,因为可以在exists-call和doing-something-call之间删除该文件。
我同意上述情况。但对我来说,存在更多使用exists()。我将空的虚拟文件放在我的临时和缓存目录中。当我执行危险操作时,例如从缓存目录中删除旧文件,我会查找我的虚拟文件,以确保我没有在错误的目录中运行。即我只需要确认文件在那里。存在完全适合这个法案,但我想我会转而使用stat()代替。
答案 4 :(得分:0)
existsSync的实现是这样的(v0.10.25):
function (path) {
try {
nullCheck(path);
binding.stat(pathModule._makeLong(path));
return true;
} catch (e) {
return false;
}
}
所以,如果您编写if(fs.existsSync(thepath)){}
之类的程序,最好将其更改为if(fs.statSync(thepath)){}
。
答案 5 :(得分:0)
我正在寻找这个问题的解决方案,发现fs.exists和fs.existsSync已被弃用。这似乎在我的senario中运作良好
fs.readFile(filename, 'utf8', function(err,data){
// the err variable substitutes for the fs.exists callback function variable
if (!err){
// do what you planned with the file
console.log(data)
}else{
// handle the non-existence of the file
console.log('File does not exist!');
}
});
答案 6 :(得分:0)
您可以为此使用新安装并继续使用它:
https://github.com/imyller/node-fs-exists-nodeback
jsonObject