创建或使用现有目录时避免竞争条件

由于 Node 的异步性质,首先创建或使用目录:

  1. 然后用 fs.stat() 检查它的存在
  2. 根据存在检查的结果创建或使用它,

如果在检查时间和创建时间之间创建文件夹,则会导致竞争条件 。下面的方法将 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