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 の フォロー」 お願いします!!