npm にあがっているソースが Promise に対応していなかったので、 Promise 対応版を作ってみました。 こういうのは本当は pull request するものなんでしょうが… 名前がいろいろ被っていてアップロード難しかったのでこのままここに貼り付けておきます。
ソースコード(mkdir-r)
ソースコードは以下に記載のものですべてなので、以下のコードをコピペすれば使えます。
mkdir-r.js
var fs = require("fs"); var path = require("path"); /** * Make specified directory recursively. * @param {string} url Directory or file path. * @param {number} [mode] Accessibility. */ var makeDirectoryRecursivelySync = function (url, mode) { var dir = ""; var list = path.normalize(url).split(path.sep); var max = list.length - 1; dir = list.slice(0, max).join(path.sep); try { fs.mkdirSync(dir, mode); } catch (error) { if (error.code === "ENOENT") { makeDirectoryRecursivelySync(list.slice(0, max - 1).join(path.sep) + path.sep, mode); fs.mkdirSync(dir, mode); } else { throw error; } } }; /** * Asyncronouse make specified directory recursively. * @param {string} url Directory or file path. * @param {number} [mode] Accesibility. * @param {function} callback Callback function which called when directories creation is completed. */ var makeDirectoryRecursivelyAsync = function (url, mode, callback) { var main = function (url, mode, callback) { if (typeof (mode) === "function") { callback = mode; mode = undefined; } var dir = ""; var list = path.normalize(url).split(path.sep); var max = list.length - 1; dir = list.slice(0, max).join(path.sep); fs.mkdir(dir, mode, (error) => { if (error) { if (error.code === "ENOENT") { makeDirectoryRecursivelyAsync(list.slice(0, max - 1).join(path.sep) + path.sep, mode, (error) => { fs.mkdir(dir, mode, callback); }); } else { throw error; } } else { callback && callback(null); } }); }; if (callback) { main(url, mode, callback); } else { return new Promise((resolve, reject) => { main(url, mode, (error) => { if (error) { reject(error); } else { resolve(null); } }) }); } }; module.exports = makeDirectoryRecursivelyAsync; module.exports.sync = makeDirectoryRecursivelySync; module.exports.async = makeDirectoryRecursivelyAsync;
API ドキュメント
mkdir-r(url, mode, callback)
非同期で指定されたディレクトリまで再帰的に作成します。
引数
url
- 再帰的に作成したいディレクトリパスを指定します。
最後のセパレータ
/
までをディレクトリとして認識します。 例えば"/a/b/c"
であればc
はファイルとして認識するので、作成されるディレクトリはa
およびb
になります。 mode
- 作成するディレクトリのアクセス権を設定します。
callback(error)
- 作成が完了したとき呼び出されます。
引数は エラーオブジェクト
error
のみです。
戻り値
Promise
- コールバックが設定された
Promise
オブジェクト を戻します。
使い方
単純に作成するだけであれば以下のようなコードになります。
var mkdir = require("./mkdir-r2.js"); mkdir("/data/write1/hoge/foo/bar.txt");
作成した後に何かしたい場合はコールバックを指定します。
var mkdir = require("./mkdir-r2.js"); mkdir("/data/write1/hoge/foo/bar.txt", (error) => { if (error) { console.log(error.message); return; } console.log("complete"); });
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!