建立或使用現有目錄時避免競爭條件
由於 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