包 | system.utils |
---|---|
继承 | class CFileHelper |
源自 | 1.0 |
版本 | $Id: CFileHelper.php 3289 2011-06-18 21:20:13Z qiang.xue $ |
源码 |
CFileHelper提供了一系列用于常用的文件系统操作的助手方法。
公共方法
方法 | 描述 | 定义在 |
---|---|---|
copyDirectory() | 递归地将一个目录进行复制。 | CFileHelper |
findFiles() | 返回指定的目录和其子目录下的文件。 | CFileHelper |
getExtension() | 返回一个包含路径的文件名的扩展名。 | CFileHelper |
getMimeType() | 确定指定文件的 MIME 类型。 | CFileHelper |
getMimeTypeByExtension() | 根据给定文件的扩展名确定它的MIME类型。 | CFileHelper |
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
copyDirectoryRecursive() | 复制一个目录。 | CFileHelper |
findFilesRecursive() | 返回指定目录和它的子目录下的文件。 | CFileHelper |
validatePath() | 验证一个文件或目录。 | CFileHelper |
方法详细
copyDirectory()
方法
public static void copyDirectory(string $src, string $dst, array $options=array (
))
| ||
$src | string | 源目录 |
$dst | string | 目标目录 |
$options | array | 进行目录复制时使用的选项。可用选项包括:
|
public static function copyDirectory($src,$dst,$options=array())
{
$fileTypes=array();
$exclude=array();
$level=-1;
extract($options);
self::copyDirectoryRecursive($src,$dst,'',$fileTypes,$exclude,$level,$options);
}
递归地将一个目录进行复制。 如果目标目录不存在,它将被创建。
copyDirectoryRecursive()
方法
protected static void copyDirectoryRecursive(string $src, string $dst, string $base, array $fileTypes, array $exclude, integer $level, array $options)
| ||
$src | string | 源目录 |
$dst | string | 目标目录 |
$base | string | 源目录的基准路径 |
$fileTypes | array | 文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被返回。 |
$exclude | array | 目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被返回。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。 |
$level | integer | 递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。 |
$options | array | 附加选项。可用选项包括: newDirMode - 为目标目录设定的权限(默认值为 0777); newFileMode - 为复制的目标文件设置的权限(默认值为当前环境的默认设置)。 |
protected static function copyDirectoryRecursive($src,$dst,$base,$fileTypes,$exclude,$level,$options)
{
if(!is_dir($dst))
mkdir($dst);
if(isset($options['newDirMode']))
@chmod($dst,$options['newDirMode']);
else
@chmod($dst,0777);
$folder=opendir($src);
while(($file=readdir($folder))!==false)
{
if($file==='.' || $file==='..')
continue;
$path=$src.DIRECTORY_SEPARATOR.$file;
$isFile=is_file($path);
if(self::validatePath($base,$file,$isFile,$fileTypes,$exclude))
{
if($isFile)
{
copy($path,$dst.DIRECTORY_SEPARATOR.$file);
if(isset($options['newFileMode']))
@chmod($dst.DIRECTORY_SEPARATOR.$file, $options['newFileMode']);
}
else if($level)
self::copyDirectoryRecursive($path,$dst.DIRECTORY_SEPARATOR.$file,$base.'/'.$file,$fileTypes,$exclude,$level-1,$options);
}
}
closedir($folder);
}
复制一个目录。 此方法主要被copyDirectory调用。
findFiles()
方法
public static array findFiles(string $dir, array $options=array (
))
| ||
$dir | string | 需要查找的目录 |
$options | array | 文件搜索的选项。可用的选项包括:
|
{return} | array | 在此目录下找到的文件。文件的列表已经过排序。 |
public static function findFiles($dir,$options=array())
{
$fileTypes=array();
$exclude=array();
$level=-1;
extract($options);
$list=self::findFilesRecursive($dir,'',$fileTypes,$exclude,$level);
sort($list);
return $list;
}
返回指定的目录和其子目录下的文件。
findFilesRecursive()
方法
protected static array findFilesRecursive(string $dir, string $base, array $fileTypes, array $exclude, integer $level)
| ||
$dir | string | 源目录 |
$base | string | 源目录的基准路径 |
$fileTypes | array | 文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被返回。 |
$exclude | array | 目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被返回。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。 |
$level | integer | 递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。 |
{return} | array | 此目录下的文件 |
protected static function findFilesRecursive($dir,$base,$fileTypes,$exclude,$level)
{
$list=array();
$handle=opendir($dir);
while(($file=readdir($handle))!==false)
{
if($file==='.' || $file==='..')
continue;
$path=$dir.DIRECTORY_SEPARATOR.$file;
$isFile=is_file($path);
if(self::validatePath($base,$file,$isFile,$fileTypes,$exclude))
{
if($isFile)
$list[]=$path;
else if($level)
$list=array_merge($list,self::findFilesRecursive($path,$base.'/'.$file,$fileTypes,$exclude,$level-1));
}
}
closedir($handle);
return $list;
}
返回指定目录和它的子目录下的文件。 此方法主要被findFiles调用。
getExtension()
方法
(可用自 v1.1.2)
public static string getExtension(string $path)
| ||
$path | string | 文件路径 |
{return} | string | 不包含点号的扩展名 |
public static function getExtension($path)
{
return pathinfo($path, PATHINFO_EXTENSION);
}
返回一个包含路径的文件名的扩展名。 例如,“path/to/something.php”将返回“php”。
getMimeType()
方法
public static string getMimeType(string $file, string $magicFile=NULL, boolean $checkExtension=true)
| ||
$file | string | 文件名 |
$magicFile | string | 魔术数据库文件名,通常类似于 /path/to/magic.mime。 它将作为第二个参数传递给finfo_open。 此参数从1.1.3版开始可用。 |
$checkExtension | boolean | 当MIME类型不能依据finfo和mim_content_type确定时 是否检测文件扩展名。默认值是true。此参数从1.1.3版开始可用。 |
{return} | string | MIME类型。当MIME类型无法确定时返回Null。 |
public static function getMimeType($file,$magicFile=null,$checkExtension=true)
{
if(function_exists('finfo_open'))
{
$options=defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
$info=$magicFile===null ? finfo_open($options) : finfo_open($options,$magicFile);
if($info && ($result=finfo_file($info,$file))!==false)
return $result;
}
if(function_exists('mime_content_type') && ($result=mime_content_type($file))!==false)
return $result;
return $checkExtension ? self::getMimeTypeByExtension($file) : null;
}
确定指定文件的 MIME 类型。 此方法按下列顺序依次尝试:
- finfo
- mime_content_type
- getMimeTypeByExtension, 当 $checkExtension 被设置为true。
getMimeTypeByExtension()
方法
public static string getMimeTypeByExtension(string $file, string $magicFile=NULL)
| ||
$file | string | 文件名 |
$magicFile | string | 包含了所有有效的MIME类型信息的文件的路径 如果没有设置,将使用默认值 'system.utils.mimeTypes' 文件。 此参数从1.1.3版开始可用。 |
{return} | string | MIME类型。当MIME类型无法确定时返回Null。 |
public static function getMimeTypeByExtension($file,$magicFile=null)
{
static $extensions;
if($extensions===null)
$extensions=$magicFile===null ? require(Yii::getPathOfAlias('system.utils.mimeTypes').'.php') : $magicFile;
if(($ext=pathinfo($file, PATHINFO_EXTENSION))!=='')
{
$ext=strtolower($ext);
if(isset($extensions[$ext]))
return $extensions[$ext];
}
return null;
}
根据给定文件的扩展名确定它的MIME类型。 此方法使用了一个本地的扩展名与MIME类型的映射。
validatePath()
方法
protected static boolean validatePath(string $base, string $file, boolean $isFile, array $fileTypes, array $exclude)
| ||
$base | string | 源目录的基准路径 |
$file | string | 文件或目录的名字 |
$isFile | boolean | 是否是一个文件 |
$fileTypes | array | 文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被验证。 |
$exclude | array | 目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被验证。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。 |
{return} | boolean | 此文件或目录是否有效 |
protected static function validatePath($base,$file,$isFile,$fileTypes,$exclude)
{
foreach($exclude as $e)
{
if($file===$e || strpos($base.'/'.$file,$e)===0)
return false;
}
if(!$isFile || empty($fileTypes))
return true;
if(($type=pathinfo($file, PATHINFO_EXTENSION))!=='')
return in_array($type,$fileTypes);
else
return false;
}
验证一个文件或目录。