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

示例

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

  1. 用检查它的存在,然后fs.stat()

  2. 根据存在检查的结果来创建或使用它,

如果在检查时间到创建时间之间创建了文件夹,则可能导致竞争状态。下面的方法进行包装,并在捕捉错误的包装器中进行包装,以使异常通过(如果已存在)其代码。如果错误是其他错误,例如(拒绝通过),则像本机函数一样抛出或传递错误。fs.mkdir()fs.mkdirSync()EEXISTEPERM

异步版本 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);

  // 在这里使用`。/ existingDir`

});

同步版本 fs.mkdirSync()

function mkdirSync (dirPath) {
  try {
    fs.mkdirSync(dirPath);
  } catch(e) {
    if (e.code!== 'EEXIST' ) throw e;
  }
}

mkdirSync('./existing-dir');
// 现在用`。/ existing-dir`做点什么