用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..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
解决了, 循环里改变了path的值,忘记保存了.又精简了代码