用php创建文件碰到点问题

发布于 2022-09-04 13:46:05 字数 3578 浏览 26 评论 0

需求如下:

$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..
图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄离 2022-09-11 13:46:05

解决了, 循环里改变了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;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文