递归创建目录
要求:自己写函数
要求:自己写函数
完成一次创建 ./a/b/c/d/e 目录
function createdir($path) {
// 判断传过来的$path是否已是目录,若是,则直接返回true
if(is_dir($path)) {
return true;
}
// 走到这步,说明传过来的$path不是目录
// 判断其上级是否为目录,是,则直接创建$path目录
if(is_dir(dirname($path))) {
return mkdir($path);
}
// 走到这说明其上级目录也不是目录,则继续判断其上上...级目录
createdir(dirname($path));
// 走到这步,说明上级目录已创建成功,则直接接着创建当前目录,并把创建的结果返回
return mkdir($path);
}
echo createdir('./a/b/c/d/e')?'ok':'false';
巧妙运用三元运算符来创建联级目录:
function mk_dir($path) {
// 如果目录已经存在,直接返回
if(is_dir($path)) {
return true;
}
// 如果目录不存在,创建
//想要创建$path目录,要么$path的父目录dirname($path)存在,要么你就帮我创建父目录
//终止条件:找到了父目录,不去创建父目录了
return is_dir(dirname($path))||mk_dir(dirname($path))?mkdir($path):false;
}
echo mk_dir('./aa/bb/cc')?'ok':'false';
这里面需要注意的是,如果不用return时,直接 is_dir(dirname($path))||mk_dir(dirname($path))?mkdir($path):false;那么最终打印的只有./aa目录,为什么呢?原因在于但程序知道到./aa这步时,来到这里就会先判断is_dir(dirname($path)),这时的结果为真,那么则会执行?号后面的mkdir($path),也就是创建aa目录,但是!创建完后并没有return,因此上一级递归调用的mk_dir()函数并没有返回值,没值就会认为是空,false,为false的话,递归的上一级就不会调用mkdir($path),因此最终创建的就只有aa目录!
通过上面的描述,如果我们想在没有return的情况下也能创建联级目录的话,也可以,只需要把 is_dir(dirname($path))||mk_dir(dirname($path))?mkdir($path):false;
这段代码变一下:
mk_dir(dirname($path))||is_dir(dirname($path))?mkdir($path):false;
这样的话也能成功创建联级目录!
其实,php5的mkdir函数,自身就能够创建级联目录
mkdir()中的第三个bool参数表示是否创建级联目录:
echo mkdir('./aaa/bbb/ccc',0777,true)?'ok':'false';