算法 - 用php创建文件碰到点问题

查看:106
本文介绍了算法 - 用php创建文件碰到点问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

需求如下:

$fileArr = array(
    'Application'=>array(
        'Common'=>'functions.php',
        'Home'=>array(
            'Controller'=>'IndexController.class.php',
            'Model'=>'IndexModel.class.php',
            'View'=>array(
                'Index'=>'index.php',
            )
        ),
        'Config'
    )
);

按照以上目录结构生成相对应的文件结构.
我的函数如下:

/**
     * 生成文件  不支持纯数字目录名称
     * @param mixed $fileArr 数组或字符串(文件名或目录名)
     * eg: $fileArr = array('dir1'=>'1.html','dir2'=>array('subdir1'=>'2.html','subdir2'=>'3.html','4.html'))
     * 生成的文件路径层级如下
     * --dir1--1.html
     *   |
     *   dir2--subdir1--2.html
     *       |
     *        -subdir2--3.html
     *       |
     *        -4.html
     */
    public static function create($path,$files)
    {
        if(!is_dir($path))
        {
            exit('请输入正确的路径名称.<br>报错信息来自:'.__FILE__.'第'.__LINE__.'行');
        }
        $path = str_replace('\\','/',$path);   //替换斜杠
        if(strrpos($path,'/')!=strlen($path))
        {  //检查$path,是否有末尾的'/',若没有则自动添加
            $path .= '/';
        }
        if( empty($files))
        {
            exit('没有指定创建任何文件.<br>报错信息来自:'.__FILE__.'第'.__LINE__.'行');
        }

        if(!is_readable($path))
        {
            exit('您对['.$path.']目录不具有写入权限,写入失败<br>报错信息来自:'.__FILE__.'第'.__LINE__.'行');
        }

        if(is_string($files))
        {   //若传递字符串则直接创建
            $file = $path.$files;
            if(self::hasExt($files))
            {
                fopen($file,'wb');
            }
            else
            {
                mkdir($file);
            }
            return;
        }
        if(is_array($files))
        {
            foreach ($files as $key => $item)
            {
                if(self::hasExt($key))
                {
                    exit($key.'键名不能是文件');
                }

                if(self::hasExt($item))
                {   //如果有后缀,说明$item是文件. 创建后返回.
                    if(is_numeric($key))
                    { //$key若是纯数字,自动判断为在当前目录下创建该文件
                        $file = $path.$item;
                        if(file_exists($file))
                        {
                            exit('目录中文件已存在'.$file.',写入失败.<br>报错信息来自:'.__FILE__.'第'.__LINE__.'行');
                        }
                        fopen($file,'wb'); //创建文件
                    }
                    else
                    {   //$key若不是纯数字,先创建目录,再创建文件
                        $new_path = $path.$key;
                        mkdir($new_path);
                        $new_file = $new_path.'/'.$item;
                        fopen($new_file,'wb');
                    }
                }
                else
                {  //如果$item没后缀,说明是目录,创建目录并递归
                    if(is_string($key))
                    {
                        $path = $path.$key;
                        mkdir($path);
                    }
                    self::create($path,$item);
                }
            }
        }

    }
    
    
    /**
     * 判断文件名称是否有后缀
     * @param string $file
     * @return bool 有后缀返回true,否则返回false.
     */
    public static function hasExt($file)
    {
        if(!is_string($file)) return false;
        return is_bool(strpos($file,'.'))? false : true;
    }

执行上述代码:

File::create(__DIR__.'/',$fileArr);

最终生成的文件结构有点差别, 求找bug..

解决方案

解决了, 循环里改变了path的值,忘记保存了.又精简了代码

    /**
     * 生成文件  不支持纯数字目录名称
     * @param string $path
     * @param array $files
     * eg: $fileArr = array('dir1'=>'1.html','dir2'=>array('subdir1'=>'2.html','subdir2'=>'3.html','4.html'))
     * 生成的文件路径层级如下
     * --dir1--1.html
     *   |
     *   dir2--subdir1--2.html
     *       |
     *        -subdir2--3.html
     *       |
     *        -4.html
     */
    public static function create($path,array $files)
    {
        //1. 数字键值,字符串文件名  array('config')
        //2. 数字键值,字符串文件目录 array('test.html')
        //3. 字符串键值,字符串文件名  array('test'=>'test.txt')
        //4. 字符串键值,字符串文件目录 array('test'=>'test1')
        //5. 字符串键值,数组文件目录 array('test'=>array('test1'));
        $path = str_replace('\\','/',$path);   //替换斜杠
        if(strrpos($path,'/')!=strlen($path)-1)
        {  //检查$path,是否有末尾的'/',若没有则自动添加
            $path .= '/';
        }

        foreach ($files as $key=>$item)
        {
            $temp = $path;
            if(!is_numeric($key))
            {
                $path .= $key;
                mkdir($path);
            }
            if(is_string($item))
            {
                $file = $path.'/'.$item;
                if(self::hasExt($item))
                {
                    fopen($file,'wb');
                }else{
                    mkdir($file);
                }
            }
            if(is_array($item))
            {
                self::create($path,$item);
            }
            $path = $temp;
        }
    }

    /**
     * 判断文件名称是否有后缀
     * @param string $file
     * @return bool 有后缀返回true,否则返回false.
     */
    public static function hasExt($file)
    {
        if(!is_string($file)) return false;
        return is_bool(strpos($file,'.'))? false : true;
    }

这篇关于算法 - 用php创建文件碰到点问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆