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 相关文章推荐
smarty实例教程
Nov 19 PHP
php获取文件大小的方法
Feb 26 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
PHPThumb图片处理实例
May 03 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
PHP实现微信申请退款功能
Oct 01 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 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
php生成QRcode实例
2014/09/22 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
用户注册常用javascript代码
2009/08/29 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
Ext 今日学习总结
2010/09/19 Javascript
javascript测试题练习代码
2012/10/10 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
英语商务邀请函范文
2014/01/16 职场文书
会议邀请书范文
2014/02/02 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
走进敬老院活动总结
2014/07/10 职场文书
小学教研工作总结2015
2015/05/13 职场文书
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android