创建或使用现有目录时避免竞争条件
由于 Node 的异步性质,首先创建或使用目录:
- 然后用
fs.stat()
检查它的存在 - 根据存在检查的结果创建或使用它,
如果在检查时间和创建时间之间创建文件夹,则会导致竞争条件 。下面的方法将 fs.mkdir()
和 fs.mkdirSync()
包装在错误捕获的包装器中,如果其代码为 EEXIST
(已存在),则允许异常通过。如果错误是其他的,比如 EPERM
(pemission denied),抛出或传递像本机函数那样的错误。
与 fs.mkdir()
的异步版本
var fs = require('fs');
function mkdir (dirPath, callback) {
fs.mkdir(dirPath, (err) => {
callback(err && err.code !== 'EEXIST' ? err : null);
});
}
mkdir('./existingDir', (err) => {
if (err)
return console.error(err.code);
// Do something with `./existingDir` here
});
与 fs.mkdirSync()
的同步版本
function mkdirSync (dirPath) {
try {
fs.mkdirSync(dirPath);
} catch(e) {
if ( e.code !== 'EEXIST' ) throw e;
}
}
mkdirSync('./existing-dir');
// Do something with `./existing-dir` now