php递归创建目录方法

测试代码

var_dump('cr=>', $docs->mkdir("g:\\qidizi/qidizi/1/2/3/4/5/./../../.././6"));exit;

输出

string(4) "cr=>"string(23) "g:/qidizi/qidizi/1/2/6/" 


生成目录结果,并没有生成3,4,5这个目录

G:\qidizi\qidizi\1\2\6


创建window共享目录的方法

var_dump('cr=>', $docs->mkdir("//qidizi/qidizi/1/2/3/4/5/./../../.././6"));exit;

生成目录结果会是

\\QIDIZI\qidizi\1\2\6


------------方法代码----------------



     
        
         /*
     * 循环创建目录
     * return:失败false, 成功返回绝对路径
     * 注意/或是\起始的路径在window下被解析成当成php的盘符:/
     * \\或//在window下被认为是共享路径,如果指定是共享路径,必须指定到目录级,不能只指定到机器名这级;
     */
    public function mkdir($path = '', $mode = 0777) {
        if (empty($path)) {
            trigger_error('mkdir方法的path路径参数值必须指定', E_USER_ERROR);
            return false;
        }
        
        $path = trim($path);
        $path = preg_replace("/[\\\\\/]$/", '', $path);//移除最后的分隔符
        $thisDir = str_replace("\\", '/', dirname(__FILE__)).'/';
        $path = str_replace("\\", '/', $path);
        $re = "/^\/\/[^\/]+\/[^\/]+\/?|^\/|^[a-z]\:\//i";
        
        if (preg_match($re, $path, $root)) {//net driver \\serverName
            $root = $root[0];
            $path = substr($path, strlen($root));
        } else {//relative
            preg_match($re, $thisDir, $root);
            $root = $root[0];
            $path = substr($thisDir, strlen($root)) .$path;
        }
        
        $path = preg_replace("/\/{2,}/", '/', $path);// 把// 变成/
        $pathc = explode('/', $path);
        $cdir = $root;
        $path = array();
        
        if (!is_dir($cdir)) {//对于window //computer/sharfolder,is_dir('//computer')返回false,必须指定到目录,所以,对于//或是\\开始的目录,根目录必须是目录,不能是机器名
            trigger_error($cdir. '根目录不存在', E_USER_ERROR);
            return false;
        }
        
        foreach ($pathc as $f) {//移除 .与..,防止..导致创建了没用的目录后..向上引用
            if ('.' == $f) {
                continue;
            } else if ('..' == $f) {
                array_pop($path);
            } else {
                $path[] = $f;
            }
        }
        
        foreach ($path as $f) {            
            $cdir .= ($root == $cdir ? '' : '/').$f;
            
            if (is_dir($cdir)) {
                continue;
            }
            
            if (!is_writable(dirname($cdir))) {
                trigger_error($cdir. '目录不能创建,上级目录不允许写入', E_USER_ERROR);
                return false;
            }
            
            if (!mkdir($cdir, $mode)) {
                trigger_error($cdir. '目录创建出错', E_USER_ERROR);
                return false;
            }
        }
        
        return $cdir;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值