php函数mkdir实现递归创建层级目录


Posted in PHP onOctober 27, 2016

下面是我从网上整理的资料,会为大家详细介绍php函数mkdir的具体用法,希望对有这方面需求的朋友有所帮助。

项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等。这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法。

php默认的mkdir一次只能创建一层目录,而要逐层创建各级目录的话,一般都是先从父创建,然后逐层往下创建,但是这样手工创建的话,有点太过于麻烦了。

我们写程序是做什么的?不久是为了能自动化实现我们需要的功能么,这里的方法就是为了能够通过程序帮我们自动创建完成层级目录。

思路有两种:

一、从上往下(父级→子级)

1.先判断 父级 目录是否存在,不存在则创建;
2.判断二级子目录是否存在,不能存在则创建,
3.在第二步中以子目录作为参数递归调用函数本身。

二、从下往上(子级→父级)

1.先判断最底层目录是否存在;
2.判断底层目录的上层目录是否存在,不存在则以上层目录作为参数递归进行。

以下是几种方法:

1:递归创建目录,此种方法是我目前感觉比较好的方法。

function mkDirs($dir){
  if(!is_dir($dir)){
    if(!mkDirs(dirname($dir))){
      return false;
    }
    if(!mkdir($dir,0777)){
      return false;
    }
  }
  return true;
}
mkDirs('1/2/3/');

2:递归创建级联目录,如果第一个方法不太理解的话,可以结合下面这个方法理解

function mkDirs1($path){
  if(is_dir($path)){//已经是目录了就不用创建
    return true;
  }
  if(is_dir(dirname($path))){//父目录已经存在,直接创建
    return mkdir($path);
  }
  mkDirs1(dirname($path));//从子目录往上创建
  return mkdir($path);//因为有父目录,所以可以创建路径
}
//mkDirs1('1/2/3/');

3:迭代创建级联目录

function makedir($path){
  $arr=array();
  while(!is_dir($path)){
    array_push($arr,$path);//把路径中的各级父目录压入到数组中去,直接有父目录存在为止(即上面一行is_dir判断出来有目录,条件为假退出while循环)
    $path=dirname($path);//父目录
  }
  if(empty($arr)){//arr为空证明上面的while循环没有执行,即目录已经存在
    echo $path,'已经存在';
    return true;
  }
  while(count($arr)){
    $parentdir=array_pop($arr);//弹出最后一个数组单元
    mkdir($parentdir);//从父目录往下创建
  }
}
makedir('1/2/3');

PS:有时候程序脚本的文件不一定在网站根目录,而创建的文件需要在根目录创建,那我们就需要用到网站根目录路径:$_SERVER['DOCUMENT_ROOT'];所以我不建议使用后面的三个方法。

以下三种是通过'/'分割路径的方法进行创建的。

function mk1($dir){
  $arr=explode("/",$dir);
  $path='';
  for($i=0;$i< count($arr);$i++){
    $path.=$arr[$i].'/';
    if(!is_dir($path)){
      mkdir($path,0777);
    }
  }
}

function mk2($dir){
  static $i=0;
  $path='';
  $arr=explode("/",$dir);
  if($i < count($arr)){
    $path.=$arr[$i];
    mkdir($path,0777,true);
    $i++;
    mk2($path."/");
  }
}
function mkdirs0($path){
  $dirs = explode('/',$path);
  for ($c=0;$c < count($dirs); $c++) {
    $thispath="";
    for ($cc=0; $cc <= $c; $cc++) {
      $thispath.=$dirs[$cc].'/';
    }
    if (!is_dir($thispath)) {
      mkdir($thispath,0777);
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
深入理解php的MySQL连接类
Jun 07 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
PHP实现递归目录的5种方法
Oct 27 #PHP
PHP读取大文件的几种方法介绍
Oct 27 #PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 #PHP
PHP中的密码加密的解决方案总结
Oct 26 #PHP
php 解析xml 的四种方法详细介绍
Oct 26 #PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 #PHP
php 生成签名及验证签名详解
Oct 26 #PHP
You might like
php阻止页面后退的方法分享
2014/02/17 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
js切换div css注意的细节
2012/12/10 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
javascript实现下雨效果
2017/03/27 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
python 实时遍历日志文件
2016/04/12 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python七夕浪漫表白源码
2019/04/05 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
PHP如何设置和取得Cookie值
2015/06/30 面试题
生产主管岗位职责
2013/11/10 职场文书
读书心得体会
2013/12/28 职场文书
现场施工员岗位职责
2014/03/10 职场文书
医药销售自我评价200字
2014/09/11 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
小班下学期个人总结
2015/02/12 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
放假通知格式
2015/04/14 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书