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程序中的常见漏洞进行攻击(下)
Oct 09 PHP
在PHP中执行系统外部命令
Oct 09 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
详解no input file specified 三种解决方法
Nov 29 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表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
Javascript模块模式分析
2008/05/16 Javascript
javascript this用法小结
2008/12/19 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
跟老齐学Python之正规地说一句话
2014/09/28 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
如何使用repr调试python程序
2020/02/28 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
python3访问字典里的值实例方法
2020/11/18 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
学习雷锋倡议书
2014/04/15 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
我爱我校演讲稿
2014/05/21 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
影视广告专业求职信
2014/09/02 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014年卫生工作总结
2014/11/27 职场文书
小班上学期个人总结
2015/02/12 职场文书
花田少年史观后感
2015/06/16 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
员工安全责任协议书
2016/03/22 职场文书
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis