建立或使用現有目錄時避免競爭條件

由於 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