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 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
php中in_array函数用法分析
Nov 15 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
Laravel实现表单提交
May 07 PHP
PHP验证类的封装与使用方法详解
Jan 10 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 PHP
php使用event扩展的io复用测试的示例
Oct 20 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
php 一元分词算法
2009/11/30 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python安装scipy的方法步骤
2019/06/26 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
毕业生求职信
2014/06/10 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
迎新生标语大全
2014/10/06 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
鸡毛信观后感
2015/06/11 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript