npm にあがっているソースが Promise に対応していなかったので、 Promise 対応版を作ってみました。 こういうのは本当は pull request するものなんでしょうが… 名前がいろいろ被っていてアップロード難しかったのでこのままここに貼り付けておきます。
ソースコード(mkdir-r)
ソースコードは以下に記載のものですべてなので、以下のコードをコピペすれば使えます。
mkdir-r.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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
オブジェクト を戻します。
使い方
単純に作成するだけであれば以下のようなコードになります。
1 2 3 | var mkdir = require( "./mkdir-r2.js" ); mkdir( "/data/write1/hoge/foo/bar.txt" ); |
作成した後に何かしたい場合はコールバックを指定します。
1 2 3 4 5 6 7 8 9 | 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 の フォロー」 お願いします!!