【php】mkdir()でディレクトリを作る
問題
以下のような感じで、年月日が変わればディレクトリを作っていきたいのですが、子ディレクトリ、孫ディレクトリを作る処理ってどうしたらいいですか。
/log/2015/07/30 /log/2015/07/31 /log/2015/08/01 ... ...
答え
「すでにディレクトリがあったらどうするべきか」は、プログラム全般の問題というよりは、そのシステムの仕様や運用の問題なので、以下のような簡単な場合を考える。
1、/log/年/月/日 のディレクトリがあったら作らない 2、/log/年/月/日 のディレクトリがなかったら /log/年/月/日 を作ろうとする 3、/log/年/月/日 を作れなかったらエラーにしてあきらめる(エラー発生時は、状況に応じて人が対応する)
phpで書くと以下のようになる。
<?php
$y = date('Y');
$m = date('m');
$d = date('d');
$dirname = '/log/' . $y . '/' . $m . '/' . $d;
if (!is_dir($dirname)) {
if (!mkdir($dirname, 0777, true)) {
//mkdirがfalseを返したら何か問題があったとみなして、エラー時の処理を行う
}
}
・解説
/log/年 という名前のファイルや、/log/年/月 という名前のファイルや、/log/年/月/日 という名前のファイルが存在した場合、/log/年/月/日 というディレクトリは作ることができない。そこまでチェックする意味がなく、「作れなかったらあきらめる」だけでよければ、そうすることで処理は簡単になる。
mkdir関数は、目的のディレクトリの親ディレクトリがないとき、第3引数をtrueにすることで、自動的に作らせることができる。
パーミッションは 0777 がmkdir関数のデフォルト。0755を指定するのもよいでしょう。
/log/年/月/日 というディレクトリがある状態で mkdir('/log/年/月/日') をすると、それもエラー(返り値 false)になるので、目的のディレクトリまでの途中のパスはチェックを省略したとしても、/log/年/月/日 というディレクトリの有無はチェックした方がよいでしょう。