ディレクトリを再帰的に作成

phpで mkdir('hoge/foo/bar') てな感じで一気にディレクトリを作成しようとすると、エラーになります。hogeを作って、fooを作って、それからbarを作る… というのは面倒。ということで、今更珍しくも何ともないけど小ネタ。

/**
 * ディレクトリを再帰的に作成
 *
 * mkdir_r('hoge/foo') とかやった時にhogeがなければ、hogeを作ってから、その中にfooを作る。
 * ディレクトリの存在チェックはしない(既にある場合は作成に失敗してfalseが返る)ので注意。
 *
 * @access public
 * @param  string  $dirname 作成するディレクトリ名
 * @return boolean 作成に成功すればtrue、失敗ならfalse
 */
function mkdir_r($dirname)
{
    if (file_exists($dirname)) return false;
    // 階層指定かつ親が存在しなければ再帰
    if (strpos($dirname, '/') && !file_exists(dirname($dirname))) {
        // 親でエラーになったら自分の処理はスキップ
        if (mkdir_r(dirname($dirname)) === false) return false;
    }
    return mkdir($dirname);
}

ちょっと探してみたら、@mkdirでとりあえず作ってみてエラーだったら一階層上で作る、というのがあったけど、

  • @で出力抑止してるだけで内部的にはエラーが発生する(ログも残る)
  • エラー検出が適当なので、いざという時に原因を追いにくそう

ということで、ちょっと作ってみました。

それと、今日気付いて自分的にちょっとツボった。chmodをカナで打つと「即漏らし」。こっちはマジメになんだから勘弁してくれ。


# 追記:php5だと mkdir($dirname, 0755, true) てな感じに3つ目の引数にtrueを指定すると普通に再帰で作れます。上記はphp4のため、もしくは両対応の関数ということで一つ。