ディレクトリを再帰的に作成
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のため、もしくは両対応の関数ということで一つ。