> YII 类库手册 > CFileHelper
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 进行目录复制时使用的选项。可用选项包括:
  • fileTypes: array, 文件名后缀列表(不包括点号)。只有扩展名在此列表中的文件才会被复制。
  • exclude: array, 被排除的文件和目录的列表。每一个排除项可以是一个名字或一个目录。 如果一个文件、目录或路径与一个排除项相匹配,它将不会被复制。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。
  • level: integer, 递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。
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 文件搜索的选项。可用的选项包括:
  • 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 在此目录下找到的文件。文件的列表已经过排序。
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($pathPATHINFO_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 类型。 此方法按下列顺序依次尝试:

  1. finfo
  2. mime_content_type
  3. 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($filePATHINFO_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($filePATHINFO_EXTENSION))!=='')
        return 
in_array($type,$fileTypes);
    else
        return 
false;
}

验证一个文件或目录。

上一篇:
下一篇: