CFileHelper

优质
小牛编辑
130浏览
2023-12-01
所有包 | 方法
system.utils
继承class CFileHelper
源自1.0
版本$Id: CFileHelper.php 3289 2011-06-18 21:20:13Z qiang.xue $
源码framework/utils/CFileHelper.php
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 ( ))
$srcstring源目录
$dststring目标目录
$optionsarray进行目录复制时使用的选项。可用选项包括:
  • fileTypes: array, 文件名后缀列表(不包括点号)。只有扩展名在此列表中的文件才会被复制。
  • exclude: array, 被排除的文件和目录的列表。每一个排除项可以是一个名字或一个目录。 如果一个文件、目录或路径与一个排除项相匹配,它将不会被复制。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。
  • level: integer, 递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。
源码: framework/utils/CFileHelper.php#53 (显示) publicstaticfunctioncopyDirectory($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)
$srcstring源目录
$dststring目标目录
$basestring源目录的基准路径
$fileTypesarray文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被返回。
$excludearray目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被返回。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。
$levelinteger递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。
$optionsarray附加选项。可用选项包括: newDirMode - 为目标目录设定的权限(默认值为 0777); newFileMode - 为复制的目标文件设置的权限(默认值为当前环境的默认设置)。
源码: framework/utils/CFileHelper.php#111 (显示) protectedstaticfunctioncopyDirectoryRecursive($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']);
}
elseif($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 ( ))
$dirstring需要查找的目录
$optionsarray文件搜索的选项。可用的选项包括:
  • 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在此目录下找到的文件。文件的列表已经过排序。
源码: framework/utils/CFileHelper.php#81 (显示) publicstaticfunctionfindFiles($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)
$dirstring源目录
$basestring源目录的基准路径
$fileTypesarray文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被返回。
$excludearray目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被返回。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。
$levelinteger递归深度,默认值为-1。 Level -1 表示复制此目录下的所有子目录和文件; Level 0 表示仅表示此目录下的文件; level N 表示复制到第N层子目录。
{return}array此目录下的文件
源码: framework/utils/CFileHelper.php#158 (显示) protectedstaticfunctionfindFilesRecursive($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;
elseif($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)
$pathstring文件路径
{return}string不包含点号的扩展名
源码: framework/utils/CFileHelper.php#28 (显示) publicstaticfunctiongetExtension($path)
{
returnpathinfo($path,PATHINFO_EXTENSION);
}

返回一个包含路径的文件名的扩展名。 例如,“path/to/something.php”将返回“php”。

getMimeType() 方法
public static string getMimeType(string $file, string $magicFile=NULL, boolean $checkExtension=true)
$filestring文件名
$magicFilestring魔术数据库文件名,通常类似于 /path/to/magic.mime。 它将作为第二个参数传递给finfo_open。 此参数从1.1.3版开始可用。
$checkExtensionboolean当MIME类型不能依据finfo和mim_content_type确定时 是否检测文件扩展名。默认值是true。此参数从1.1.3版开始可用。
{return}stringMIME类型。当MIME类型无法确定时返回Null。
源码: framework/utils/CFileHelper.php#223 (显示) publicstaticfunctiongetMimeType($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)
$filestring文件名
$magicFilestring包含了所有有效的MIME类型信息的文件的路径 如果没有设置,将使用默认值 'system.utils.mimeTypes' 文件。 此参数从1.1.3版开始可用。
{return}stringMIME类型。当MIME类型无法确定时返回Null。
源码: framework/utils/CFileHelper.php#249 (显示) publicstaticfunctiongetMimeTypeByExtension($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];
}
returnnull;
}

根据给定文件的扩展名确定它的MIME类型。 此方法使用了一个本地的扩展名与MIME类型的映射。

validatePath() 方法
protected static boolean validatePath(string $base, string $file, boolean $isFile, array $fileTypes, array $exclude)
$basestring源目录的基准路径
$filestring文件或目录的名字
$isFileboolean是否是一个文件
$fileTypesarray文件扩展名列表(不含点号)。只有扩展名被包含在此列表中的文件被验证。
$excludearray目录和文件的排除项列表。每个排除项可以是一个名字或一个路径。 如果一个文件或一个路径与一个排除项相匹配,它将不会被验证。例如,一个排除项 '.svn' 将把名为 '.svn' 的文件或目录排除。一个排除项 '/a/b' 将排除文件或目录 '$src/a/b'。 注意:不管DIRECTORY_SEPARATOR常量的值是什么,都使用'/' 符号作为分隔符。
{return}boolean此文件或目录是否有效
源码: framework/utils/CFileHelper.php#192 (显示) protectedstaticfunctionvalidatePath($base,$file,$isFile,$fileTypes,$exclude)
{
foreach($excludeas$e)
{
if($file===$e||strpos($base.'/'.$file,$e)===0)
returnfalse;
}
if(!$isFile||empty($fileTypes))
returntrue;
if(($type=pathinfo($file,PATHINFO_EXTENSION))!=='')
returnin_array($type,$fileTypes);
else
returnfalse;
}

验证一个文件或目录。