You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
IYUUAutoReseed/app/Class/IFile.php

332 lines
7.2 KiB

<?php
/**
* @brief 文件处理
* @version 0.6
*/
/**
* @class IFile
* @brief IFile 文件处理类
*/
class IFile
{
private $resource = null; //文件资源句柄
/**
* @brief 构造函数,打开资源流,并独占锁定
* @param String $fileName 文件路径名
* @param String $mode 操作方式,默认为读操作,可供选择的项为:r,r+,w+,w+,a,a+
* @note $mod,'r' 只读方式打开,将文件指针指向文件头
* 'r+' 读写方式打开,将文件指针指向文件头
* 'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
* 'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
* 'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
* 'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
*/
function __construct($fileName,$mode='r')
{
$dirName = dirname($fileName);
$baseName = basename($fileName);
//检查并创建文件夹
self::mkdir($dirName);
$this->resource = fopen($fileName,$mode.'b');
if($this->resource)
{
flock($this->resource,LOCK_EX);
}
}
/**
* @brief 获取文件内容
* @return String 文件内容
*/
public function read()
{
$content = null;
while(!feof($this->resource))
{
$content.= fread($this->resource,1024);
}
return $content;
}
/**
* @brief 文件写入操作
* @param String $content 要写入的文件内容
* @return Int or false 写入的字符数; false:写入失败;
*/
public function write($content)
{
$worldsnum = fwrite($this->resource,$content);
$this->save();
return is_bool($worldsnum) ? false : $worldsnum;
}
/**
* @brief 清空目录下的所有文件
* @return bool false:失败; true:成功;
*/
public static function clearDir($dir)
{
if($dir[0] != '.' && is_dir($dir) && is_writable($dir))
{
$dirRes = opendir($dir);
while( false !== ($fileName = readdir($dirRes)) )
{
if($fileName[0] !== '.')
{
$fullpath = $dir.'/'.$fileName;
if(is_file($fullpath))
{
self::unlink($fullpath);
}
else
{
self::clearDir($fullpath);
rmdir($fullpath);
}
}
}
closedir($dirRes);
return true;
}
else
{
return false;
}
}
/**
* @brief 获取文件信息
* @param String $fileName 文件路径
* @return array or null array:文件信息; null:文件不存在;
*/
public static function getInfo($fileName)
{
if(is_file($fileName))
return stat($fileName);
else
return null;
}
/**
* @brief 创建文件夹
* @param String $path 路径
* @param int $chmod 文件夹权限
* @note $chmod 参数不能是字符串(加引号),否则linux会出现权限问题
*/
public static function mkdir($path,$chmod=0777)
{
return is_dir($path) or (self::mkdir(dirname($path),$chmod) and mkdir($path,$chmod));
}
/**
* @brief 复制文件
* @param String $from 源文件路径
* @param String $to 目标文件路径
* @param String $mod 操作模式,c:复制(默认); x:剪切(删除$from文件)
* @return bool 操作结果 true:成功; false:失败;
*/
public static function copy($from,$to,$mode = 'c')
{
$dir = dirname($to);
//创建目录
self::mkdir($dir);
copy($from,$to);
if(is_file($to))
{
if($mode == 'x')
{
self::unlink($from);
}
return true;
}
else
{
return false;
}
}
/**
* @brief 删除文件
* @param String $fileName 文件路径
* @return bool 操作结果 false:删除失败;
*/
public static function unlink($fileName)
{
if(is_file($fileName) && is_writable($fileName))
{
return unlink($fileName);
}
else
return false;
}
/**
* @brief 删除$dir文件夹 或者 其下所有文件
* @param String $dir 文件路径
* @param bool $recursive 是否强制删除,如果强制删除则递归删除该目录下的全部文件,默认为false
* @return bool true:删除成功; false:删除失败;
*/
public static function rmdir($dir,$recursive = false)
{
if(is_dir($dir) && is_writable($dir))
{
//强制删除
if($recursive == true)
{
self::clearDir($dir);
return self::rmdir($dir,false);
}
//非强制删除
else
{
if(rmdir($dir))
{
return true;
}
else
{
return false;
}
}
}
}
/**
* @brief 获取文件类型
* @param String $fileName 文件名
* @return String $filetype 文件类型
* @note 如果文件不存在,返回false,如果文件后缀名不在识别列表之内,返回NULL,对于docx及elsx格式文档识别在会出现识别为ZIP格式的错误,这是office2007的bug目前尚未修复,请谨慎使用
*/
public static function getFileType($fileName)
{
$filetype = null;
if(!is_file($fileName))
{
return false;
}
$fileRes = fopen($fileName,"rb");
if(!$fileRes)
{
return false;
}
$bin= fread($fileRes, 2);
fclose($fileRes);
if($bin != null)
{
$strInfo = unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$typelist = self::getTypeList();
foreach($typelist as $val)
{
if(strtolower($val[0]) == strtolower($typeCode))
{
if($val[0] == 8075)
{
return array('zip','docx','xlsx');
}
else
{
return $val[1];
}
}
}
}
return $filetype;
}
/**
* @brief 获取文件类型映射关系
* @return array 文件类型映射关系数组
*/
public static function getTypeList()
{
return array(
array('255216','jpg'),
array('13780','png'),
array('7173','gif'),
array('6677','bmp'),
array('6063','xml'),
array('60104','html'),
array('208207','xls/doc'),
array('8075','zip'),
array('8075','docx'),
array('8075','xlsx'),
array("8297","rar"),
);
}
/**
* @brief 获取文件大小
* @param String $fileName 文件名
* @return Int 文件大小的字节数,如果文件无效则返回 NULL
*/
public static function getFileSize($fileName)
{
return is_file($fileName) ? filesize($fileName):null;
}
/**
* @brief 检测文件夹是否为空
* @param String $dir 路径地址
* @return bool true:$dir为空目录; false:$dir为非空目录;
*/
public static function isEmptyDir($dir)
{
if(is_dir($dir))
{
$isEmpty = true;
$dirRes = opendir($dir);
while(false !== ($fileName = readdir($dirRes)))
{
if($fileName!='.' && $fileName!='..')
{
$isEmpty = false;
break;
}
}
closedir($dirRes);
return $isEmpty;
}
}
/**
* @brief 释放文件锁定
*/
public function save()
{
flock($this->resource,LOCK_UN);
}
/**
* @brief 获取文件扩展名
* @param String $fileName 文件名
* @return String 文件后缀名
*/
public static function getFileSuffix($fileName)
{
$fileInfoArray = pathinfo($fileName);
return $fileInfoArray['extension'];
}
/**
* @brief 析构函数,释放文件连接句柄
*/
function __destruct()
{
if(is_resource($this->resource))
{
fclose($this->resource);
}
}
}