不,原因有很多 .
path模块没有 exists / existsSync 方法 . 它位于fs模块中 . (也许你刚刚在你的问题上写错了?)
fs.exists()是一种时代错误,只是出于历史原因而存在 . 几乎没有理由在你自己的代码中使用它 . 特别是,在打开文件之前检查文件是否存在是一种反模式,使您容易受到竞争条件的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除该文件 . 只需打开文件并在错误处理时处理错误 .
由于我们讨论的是目录而不是文件,因此这个建议意味着您应该无条件地调用 mkdir 并忽略 EEXIST .
一般情况下,您应该避免使用* Sync 方法 . 他们're blocking, which means absolutely nothing else in your program can happen while you go to the disk. This is a very expensive operation, and the time it takes breaks the core assumption of node'的事件循环 .
Sync 方法在单用途快速脚本(那些做一件事然后退出)中通常很好,但在编写服务器时几乎不应该使用:您的服务器将无法响应整个人I / O请求的持续时间 . 如果多个客户端请求需要I / O操作,您的服务器将很快停止运行 .
我在服务器应用程序中考虑使用* Sync 方法的唯一一次是在启动时发生 once (并且只有一次)的操作 . 例如, require actually uses readFileSync来加载模块 .
即使这样,您仍然需要小心,因为大量的同步I / O会不必要地减慢服务器的启动时间 .
相反,您应该使用异步I / O方法 .
所以,如果我们把这些建议放在一起,我们会得到这样的结论:
function ensureExists(path, mask, cb) {
if (typeof mask == 'function') { // allow the `mask` parameter to be optional
cb = mask;
mask = 0777;
}
fs.mkdir(path, mask, function(err) {
if (err) {
if (err.code == 'EEXIST') cb(null); // ignore the error if the folder already exists
else cb(err); // something else went wrong
} else cb(null); // successfully created folder
});
}
我们可以像这样使用它:
ensureExists(__dirname + '/upload', 0744, function(err) {
if (err) // handle folder creation error
else // we're all good
});
当然,这并不能解决像边缘情况那样的问题
如果在程序运行时删除文件夹会怎样? (假设您在启动时仅检查它是否存在一次)
如果文件夹已存在但权限错误会怎样?