PHP递归创建多级目录

我的第一个感觉就是用递归创建,具体思路如下:

function Directory($dir){
    if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告。

        echo $dir."创建成功<br>";  //输出创建成功的目录

    }else{

        $dirArr=explode('/',$dir); //当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组
        array_pop($dirArr); //将数组中的最后一项(即子目录)弹出来,
        $newDir=implode('/',$dirArr); //重新组合成一个文件夹字符串
        Directory($newDir); //试图创建父目录
        if(@mkdir($dir,0777)){
            echo $dir."创建成功<br>";

        } //再次试图创建子目录,成功输出目录名
    }
}

Directory("A/B/C/D/E/F");

输出结果如图:

但是可以看得出来,写得也太麻烦了,在手册里翻看文件函数,看到一个dirname()函数,其原型如下:

string dirname ( string $path )

给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。

在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。

可以稍稍地优化一下:

function Directory($dir){

    if(is_dir($dir) || @mkdir($dir,0777)){ 

        echo $dir."创建成功<br>";  

    }else{

        Directory(dirname($dir));

        if(@mkdir($dir,0777)){

            echo $dir."创建成功<br>";

        }

    }

}

效果一样。
之后我在在网上搜一下答案,找到一个异常精辟的

function Directory( $dir ){  

   return  is_dir ( $dir ) or Directory(dirname( $dir )) and  mkdir ( $dir , 0777);

}

现在来解释一下整个函数:

先介绍一下PHP中逻辑运算符的优先级顺序:&& > || > and > or,即符号型>字母型,AND型>OR型,所以函数体可以看成:

is_dir ( $dir )  or  (Directory(dirname( $dir ))  and   mkdir ( $dir , 0777));

先判断目标目录是否存在,若存在,依or的短路特性,后面的整体被短路,跳过执行;若目标目录不存在,则执行后面的函数体:

Directory(dirname( $dir ))  and   mkdir ( $dir , 0777)

我考虑了一下先进行递归的用意:先执行递归,意在确认其父目录(dirname($dir))都已经创建完毕,使后面的mkdir()函数不会创建子目录时找不到父目录发出警告。

进入递归深处后,确认最深处的根目录存在后,从根目录向下依次创建目录。

最后,建议要找工作的亲们,去网上找些大公司面试题做一下,毕竟他们考得较为综合较深,在学习知识的时候,也刷一下题,另外也一定要做一下,因为很容易眼高手低,一开始的函数,我优化了好几遍才能正常使用。

这就是一道PHP递归创建多级目录面试题目,以后小编会再找些有意思的面试题跟大家分享。

(0)

相关推荐

  • PHP创建多级目录的两种方法

    PHP针对目录的创建,有一个专门的函数mkdir():成功,返回true,失败,返回false 函数mkdir有四个参数: path:要创建的目录的名称 mode:权限.默认是0777(最大权限) recursive:设置是否可以创建多级目录(true:可,false:不可) context:文件句柄的环境.context是可修改流的行为的一套选项(很少用到) 下面给大家介绍php创建多级目录的两种方法,具体详情如下所示: 1.使用递归的思想 function mkdirs_2($path){

  • php中设置多级目录session的问题

    在 php.ini 中找到 session.save_path 将值设置为 session.save_path = '3;/tmp/session'; 即可开启三级目录保存session.但是php不会自动生成目录结构,这时可以借助源码包 ext/session 目录下的 mod_files.sh 来生成目录 $ bash mod_files.sh /tmp/session 3 生成完成后发现仍然不能生成session,纠结了半天,打开mod_files.bat才发现玄机,原来后面还需要带一个参

  • php使用mkdir创建多级目录入门例子

    先介绍一下 mkdir() 这个函数: mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径:第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问权:第三个参数:true表示允许创建多级目录. 举例代码(支持创建中文目录): <?php header("Content-type:text/html;charset=utf-8"); //要创建的多级目录 $path="dai/php/php学习"; //判断

  • php创建多级目录代码

    function createFolder($path) {    if (!file_exists($path))    {     createFolder(dirname($path)); mkdir($path, 0777);    } } createFolder("2007/3/4");//在当前目录下创建2007/3/4的目录结构.

  • php循环创建目录示例分享(php创建多级目录)

    复制代码 代码如下: function mk_dir($dir, $mod = 0777){ if(!is_dir($dir) || mkdir($dir, $mod)) { if(!mk_dir(dirname($dir, $mod))) { return false; } } return mkdir($dir, $mod);} 原理:就是不断的尝试创建上层目录,依此类推

  • PHP使用mkdir创建多级目录的方法

    本文实例讲述了PHP使用mkdir创建多级目录的方法.分享给大家供大家参考,具体如下: PHP中使用mkdir()可以创建多级目录,相比之前自己一级一级的创建,这个函数非常好用. 下面是php手册上的函数介绍: 复制代码 代码如下: bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] ) 返回值为bool类型. 第一个参数:必须,代表要创建的多级

  • php创建多级目录的方法

    本文实例讲述了php创建多级目录的方法.分享给大家供大家参考.具体实现方法如下: <?php /* 写出一个能创建多级目录的PHP函数 */ function createdirlist($path,$mode){ if (is_dir($path)){ //判断目录存在否,存在不创建 echo "目录'" . $path . "'已经存在"; //已经存在则输入路径 }else{ //不存在则创建目录 $re=mkdir($path,$mode,true);

  • PHP递归创建多级目录

    我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个"父目录不存在"的警告. echo $dir."创建成功<br>"; //输出创建成功的目录 }else{ $dirArr=explode('/',$dir); //当子目录没创建成功时,试图创建父目

  • VBS递归创建多级目录文件夹的方法

    核心代码 CreateFolders "d:\jb51test\1\2\3\4\5" Function CreateFolders(path) Set fso = CreateObject("scripting.filesystemobject") CreateFolderEx fso,path set fso = Nothing End Function Function CreateFolderEx(fso,path) If fso.FolderExists(p

  • java创建多级目录文件的实例讲解

    实例如下所示: /** * 创建多级目录文件 * * @param path 文件路径 * @throws IOException */ private void createFile(String path) throws IOException { if (StringUtils.isNotEmpty(path)) { File file = new File(path); if (!file.getParentFile().exists()) { file.getParentFile().

  • php创建多级目录完整封装类操作方法

    创建多级目录函数中调用创建指定下的指定文件的函数: public function create_dir($dir,$mode=0777) { return is_dir($dir) or ($this->create_dir(dirname($dir)) and mkdir($dir, $mode)); } 创建指定路径下的指定文件,string 需要包含文件名和后缀path(需要包含文件名和后缀),booleanover_write 是否覆盖文件,int 设置时间.默认是当前系统时间time

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

    下面是我从网上整理的资料,会为大家详细介绍php函数mkdir的具体用法,希望对有这方面需求的朋友有所帮助. 项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而要逐层创建各级目录的话,一般都是先从父创建,然后逐层往下创建,但是这样手工创建的话,有点太过于麻烦了. 我们写程序是做什么的?不久是为了能自动化实现我们需要的功能么,这里的方法就是为了能够通

  • python实现一次创建多级目录的方法

    本文实例讲述了python实现一次创建多级目录的方法.分享给大家供大家参考.具体实现方法如下: import os os.makedirs( "/home/jb51/data" ) 这样就可以创建一个三级目录. 希望本文所述对大家的Python程序设计有所帮助.

  • 一个可以自动创建多级目录的函数

    <% '创建多级目录,可以创建不存在的根目录 '参数:要创建的目录名称,可以是多级 '返回逻辑值,True成功,False失败 '创建目录的根目录从当前目录开始 '--------------------------------------------------- Function CreateMultiFolder(ByVal CFolder)     Dim objFSO, PhCreateFolder, CreateFolderArray, CreateFolder     Dim i,

随机推荐