Node.js で 再帰的に ディレクトリ を作成する 方法

0 件のコメント

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) {
  if (typeof (mode) === "function") {
    callback = mode;
    mode = undefined;
  }

  var promise = new Promise((resolve, reject) => {
    process.nextTick(() => {
      try {
        makeDirectoryRecursivelySync(url, mode);
      } catch (error) {
        reject(error);
      }
      resolve();
    });
  });

  if (callback) {
    promise.then(() => {
      callback();
    }).catch((error) => {
      callback(error);
    })
  }

  return promise;
};

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-r = require("./mkdir-r2.js");

mkdir-r("/data/write1/hoge/foo/bar.txt");

作成した後に何かしたい場合はコールバックを指定します。

var mkdir-r = require("./mkdir-r2.js");

mkdir-r("/data/write1/hoge/foo/bar.txt", (error) => {
  if (error) {
    console.log(error.message);
    return;
  }
  console.log("complete");
});