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语法(4)
Oct 09 PHP
php巧获服务器端信息
Dec 06 PHP
php随机输出名人名言的代码
Oct 07 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php操作mongoDB实例分析
Dec 29 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
一个简单的php路由类
May 29 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 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
第三节--定义一个类
2006/11/16 PHP
php编写一个简单的路由类
2011/04/13 PHP
php实现webservice实例
2014/11/06 PHP
php mysql 封装类实例代码
2016/09/18 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
光声世纪笔试题目
2012/08/25 面试题
口腔医学技术应届生求职信
2013/11/09 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
社区活动策划方案
2014/08/21 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
学期个人工作总结
2015/02/13 职场文书
银行求职信模板
2015/03/20 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js