PHP常用的文件操作函数经典收藏


Posted in PHP onApril 02, 2013

以下是个人总结的PHP文件操作函数。当然,这只是部分,还有很多,我没有列出来。
一 、解析路径
1 获得文件名:
basename();
给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。如果文件名是以 suffix 结束的,那这一部分也会被去掉。
eg:

$path = "/home/httpd/html/index.php"; 
$file = basename($path,".php"); // $file is set to "index"

2 得到目录部分:
dirname();
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
eg:
$path = "/etc/passwd"; 
$file = dirname($path); // $file is set to "/etc"

3 得到路径关联数组
pathinfo();
得到一个指定路径中的三个部分:目录名,基本名,扩展名。
eg:
$pathinfo = pathinfo("www/test/index.html"); 
var_dump($pathinfo); 
// $path['dirname'] 
$path['basename'] 
$path['extenssion']

二、文件类型
1. filetype();
返回文件的类型。可能的值有 fifo,char,dir,block,link,file 和 unknown。
eg:
echo filetype('/etc/passwd'); // file 
echo filetype('/etc/'); // dir

三、得到给定文件有用信息数组(很有用)
1. fstat();
通过已打开的文件指针取得文件信息
获取由文件指针 handle 所打开文件的统计信息。本函数和 stat() 函数相似,除了它是作用于已打开的文件指针而不是文件名。
eg:
// 打开文件 
$fp = fopen("/etc/passwd", "r"); 
// 取得统计信息 
$fstat = fstat($fp); 
// 关闭文件 
fclose($fp); 
// 只显示关联数组部分 
print_r(array_slice($fstat, 13));

2. stat()
获取由 filename 指定的文件的统计信息(类比fstat())
四、计算大小
1. filesize()
返回文件大小的字节数,如果出错返回 FALSE 并生成一条 E_WARNING 级的错误。
eg:
// 输出类似:somefile.txt: 1024 bytes 
$filename = 'somefile.txt'; 
echo $filename . ': ' . filesize($filename) . ' bytes'; 
2. disk_free_space() 
获得目录所在磁盘分区的可用空间(字节单位) 
eg 
[code] 
// $df 包含根目录下可用的字节数 
$df = disk_free_space("/"); 
//在 Windows 下: 
disk_free_space("C:"); 
disk_free_space("D:");

3. disk_total_space()
返回一个目录的磁盘总大小
eg:(同上,换掉函数)
另:如需要计算一个目录大小,可以编写一个递归函数来实现
代码
function dir_size($dir){ 
$dir_size = 0; 
if($dh = @opendir($dir)){ 
while(($filename = readdir($dh)) != false){ 
if($filename !='.' and $filename !='..'){ 
if(is_file($dir.'/'.$filename)){ 
$dir_size +=filesize($dir.'/'.$filename); 
}else if(is_dir($dir.'/'.$filename)){ 
$dir_size +=dir_size($dir.'/'.$filename); 
} 
} 
}#end while 
}# end opendir 
@closedir($dh); 
return $dir_size; 
} #end function

五、访问与修改时间
1. fileatime(): 最后访问时间
2. filectime(): 最后改变时间(任何数据的修改)
3. filemtime(): 最后修改时间(指仅是内容修改)
六、 文件的I/O操作
1. fopen -- 打开文件或者 URL
mode 说明
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,
'x+' 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE
eg:
$handle = fopen("/home/rasmus/file.txt", "r");

2. file -- 把整个文件读入一个数组中(此函数是很有用的)
和 file_get_contents() 一样,只除了 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败 file() 返回 FALSE。
eg:
代码
$lines = file('http://www.example.com/'); 
// 在数组中循环,显示 HTML 的源文件并加上行号。 
foreach ($lines as $line_num => $line) { 
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n"; 
} 
// 另一个例子将 web 页面读入字符串。参见 file_get_contents()。 
$html = implode('', file ('http://www.example.com/'));

3. fgets -- 从文件指针中读取一行
从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
eg:
$handle = @fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
while (!feof($handle)) { 
$buffer = fgets($handle, 4096); 
echo $buffer; 
} 
fclose($handle); 
}

4. fgetss -- 从文件指针中读取一行并过滤掉 HTML 标记
和 fgets() 相同,只除了 fgetss 尝试从读取的文本中去掉任何 HTML 和 PHP 标记。
可以用可选的第三个参数指定哪些标记不被去掉
另:对的目录的操作:
1. opendir -- 打开目录句柄,打开一个目录句柄,可用于之后的 closedir(),readdir() 和 rewinddir() 调用中。
2. readdir -- 从目录句柄中读取条目,返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。
eg:
代码
// 注意在 4.0.0-RC2 之前不存在 !== 运算符 
if ($handle = opendir('/path/to/files')) { 
echo "Directory handle: $handle\n"; 
echo "Files:\n"; 
while (false !== ($file = readdir($handle))) { 
echo "$file\n"; 
} 
while ($file = readdir($handle)) { 
echo "$file\n"; 
} 
closedir($handle); 
} 
[code] 
3. scandir -- 列出指定路径中的文件和目录(很有用),返回一个 array,包含有 directory 中的文件和目录。 
默认的排序顺序是按字母升序排列。如果使用了可选参数 sorting_order(设为 1),则排序顺序是按字母降序排列。 
eg: 
[code] 
$dir = '/tmp'; 
$files1 = scandir($dir); 
$files2 = scandir($dir, 1); 
print_r($files1); 
print_r($files2);

另外注:
七、对文件属性的操作(操作系统环境不同,可能有所不一样,这点要注意)
1文件是否可读:
boolis_readable ( string filename )
如果由 filename 指定的文件或目录存在并且可读则返回 TRUE。
记住 PHP 也许只能以运行 webserver 的用户名(通常为 'nobody')来访问文件。不计入安全模式的限制。
2 文件是否可写
bool is_writable ( string filename )
如果文件存在并且可写则返回 TRUE。filename 参数可以是一个允许进行是否可写检查的目录名。
记住 PHP 也许只能以运行 webserver 的用户名(通常为 'nobody')来访问文件。不计入安全模式的限制
3 检查文件是否存在
boolfile_exists ( string filename )
如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE
=====================================PHP文件操作类=========================================
<?php 
/*************************************************************************************** 
文件名:File.cls.php 
文件简介:类clsFile的定义,对文件操作的封装 
版本:2.0 最后修改日期:2011-8-23 
****************************************************************************************/ 
!defined('INIT_PHPV') && die('No direct script access allowed'); 
class clsFile 
{ 
private $fileName_str; //文件的路径 
private $fileOpenMethod_str; //文件打开模式 
function __construct($fileName_str='',$fileOpenMethod_str='readOnly')//路径,默认为空;模式,默认均为只读 
{ 
//构造函数,完成数据成员的初始化 
$this->fileName_str=$fileName_str; 
$this->fileOpenMethod_str=$fileOpenMethod_str; 
} 
function __destruct() 
{ 
//析构函数 
} 
public function __get($valName_val)//欲取得的数据成员名称 
{ 
//特殊函数,取得指定名称数据成员的值 
return $this->$valName_val; 
} 
private function on_error($errMsg_str='Unkown Error!',$errNo_int=0)//错误信息,错误代码 
{ 
echo '程序错误:'.$errMsg_str.'错误代码:'.$errNo_int;//出错处理函数 
} 
public function open() 
{ 
//打开相应文件,返回文件资源标识 
//根据fileOpenMethod_str选择打开方式 
switch($this->fileOpenMethod_str) 
{ 
case 'readOnly': 
$openMethod_str='r'; //只读,指针指向文件头 
break; 
case 'readWrite': 
$openMethod_str='r+'; //读写,指针指向文件头 
break; 
case 'writeAndInit': 
$openMethod_str='w'; //只写,指针指向文件头将大小截为零,不存在则创建 
break; 
case 'readWriteAndInit': 
$openMethod_str='r+'; //读写,指针指向文件头将大小截为零,不存在则创建 
break; 
case 'writeAndAdd': 
$openMethod_str='a'; //只写,指针指向文件末尾,不存在则创建 
break; 
case 'readWriteAndAdd': 
$openMethod_str='a+'; //读写,指针指向文件末尾,不存在则创建 
break; 
default: 
$this->on_error('Open method error!',310);//出错处理 
exit; 
} 
//打开文件 
if(!$fp_res=fopen($this->fileName_str,$openMethod_str)) 
{ 
$this->on_error('Can\'t open the file!',301);//出错处理 
exit; 
} 
return $fp_res; 
} 
public function close($fp_res)//由open返回的资源标识 
{ 
//关闭所打开的文件 
if(!fclose($fp_res)) 
{ 
$this->on_error('Can\'t close the file!',302);//出错处理 
exit; 
} 
} 
public function write()//$fp_res,$data_str,$length_int:文件资源标识,写入的字符串,长度控制 
{ 
//将字符串string_str写入文件fp_res,可控制写入的长度length_int 
//判断参数数量,调用相关函数 
$argNum_int=func_num_args();//参数个数 
$fp_res=func_get_arg(0); //文件资源标识 
$data_str=func_get_arg(1); //写入的字符串 
if($argNum_int==3) 
{ 
$length_int=func_get_arg(2); //长度控制 
if(!fwrite($fp_res,$data_str,$length_int)) 
{ 
$this->on_error('Can\'t write the file!',303);//出错处理 
exit; 
} 
} 
else 
{ 
if(!fwrite($fp_res,$data_str)) 
{ 
$this->on_error('Can\'t write the file!',303);//出错处理 
exit; 
} 
} 
} 
public function read_line()//$fp_res,$length_int:文件资源标识,读入长度 
{ 
//从文件fp_res中读入一行字符串,可控制长度 
//判断参数数量 
$argNum_int=func_num_args(); 
$fp_res=func_get_arg(0); 
if($argNum_int==2) 
{ 
$length_int=func_get_arg(1); 
if($string_str=!fgets($fp_res,$length_int)) 
{ 
$this->on_error('Can\'t read the file!',304);//出错处理 
exit; 
} 
return $string_str; 
} 
else 
{ 
if(!$string_str=fgets($fp_res)) 
{ 
$this->on_error('Can\'t read the file!',304);//出错处理 
exit; 
} 
return $string_str; 
} 
} 
public function read($fp_res,$length_int)//文件资源标识,长度控制 
{ 
//读入文件fp_res,最长为length_int 
if(!$string_str=fread($fp_res,$length_int)) 
{ 
$this->on_error('Can\'t read the file!',305);//出错处理 
exit; 
} 
return $string_str; 
} 
public function is_exists($fileName_str)//文件名 
{ 
//检查文件$fileName_str是否存在,存在则返回true,不存在返回false 
return file_exists($fileName_str); 
} 
/******************取得文件大小*********************/ 
/* 
取得文件fileName_str的大小 
$fileName_str 是文件的路径和名称 
返回文件大小的值 
*/ 
public function get_file_size($fileName_str)//文件名 
{ 
return filesize($fileName_str); 
} 
/******************转换文件大小的表示方法*********************/ 
/* 
$fileSize_int文件的大小,单位是字节 
返回转换后带计量单位的文件大小 
*/ 
public function change_size_express($fileSize_int)//文件名 
{ 
if($fileSize_int>1024) 
{ 
$fileSizeNew_int=$fileSize_int/1024;//转换为K 
$unit_str='KB'; 
if($fileSizeNew_int>1024) 
{ 
$fileSizeNew_int=$fileSizeNew_int/1024;//转换为M 
$unit_str='MB'; 
} 
$fileSizeNew_arr=explode('.',$fileSizeNew_int); 
$fileSizeNew_str=$fileSizeNew_arr[0].'.'.substr($fileSizeNew_arr[1],0,2).$unit_str; 
} 
return $fileSizeNew_str; 
} 
/******************重命名文件*********************/ 
/* 
将oldname_str指定的文件重命名为newname_str 
$oldName_str是文件的原名称 
$newName_str是文件的新名称 
返回错误信息 
*/ 
public function rename_file($oldName_str,$newName_str) 
{ 
if(!rename($oldName_str,$newName_str)) 
{ 
$this->on_error('Can\'t rename file!',308); 
exit; 
} 
} 
/******************删除文件*********************/ 
/* 
将filename_str指定的文件删除 
$fileName_str要删除文件的路径和名称 
返回错误信息 
*/ 
public function delete_file($fileName_str)// 
{ 
if(!unlink($fileName_str)) 
{ 
$this->on_error('Can\'t delete file!',309);//出错处理 
exit; 
} 
} 
/******************取文件的扩展名*********************/ 
/* 
取filename_str指定的文件的扩展名 
$fileName_str要取类型的文件路径和名称 
返回文件的扩展名 
*/ 
public function get_file_type($fileName_str) 
{ 
$fileNamePart_arr=explode('.',$fileName_str); 
while(list(,$fileType_str)=each($fileNamePart_arr)) 
{ 
$type_str=$fileType_str; 
} 
return $type_str; 
} 
/******************判断文件是否是规定的文件类型*********************/ 
/* 
$fileType_str规定的文件类型 
$fileName_str要取类型的文件路径和名称 
返回false或true 
*/ 
public function is_the_type($fileName_str,$fileType_arr) 
{ 
$cheakFileType_str=$this->get_file_type($fileName_str); 
if(!in_array($cheakFileType_str,$fileType_arr)) 
{ 
return false; 
} 
else 
{ 
return true; 
} 
} 
/******************上传文件,并返回上传后的文件信息*********************/ 
/* 
$fileName_str本地文件名 
$filePath上传文件的路径,如果$filePath是str则上传到同一目录用一个文件命名,新文件名在其加-1,2,3..,如果是arr则顺序命名 
$allowType_arr允许上传的文件类型,留空不限制 
$maxSize_int允许文件的最大值,留空不限制 
返回的是新文件信息的二维数组:$reFileInfo_arr 
*/ 
public function upload_file($fileName_str,$filePath,$allowType_arr='',$maxSize_int='') 
{ 
$fileName_arr=$_FILES[$fileName_str]['name']; //文件的名称 
$fileTempName_arr=$_FILES[$fileName_str]['tmp_name']; //文件的缓存文件 
$fileSize_arr=$_FILES[$fileName_str]['size'];//取得文件大小 
$reFileInfo_arr=array(); 
$num=count($fileName_arr)-1; 
for($i=0;$i<=$num;$i++) 
{ 
if($fileName_arr[$i]!='') 
{ 
if($allowType_arr!='' and !$this->is_the_type($fileName_arr[$i],$allowType_arr))//判断是否是允许的文件类型 
{ 
$this->on_error('The file is not allowed type!',310);//出错处理 
break; 
} 
if($maxSize_int!='' and $fileSize_arr[$i]>$maxSize_int) 
{ 
$this->on_error('The file is too big!',311);//出错处理 
break; 
} 
$j=$i+1; 
$fileType_str=$this->get_file_type($fileName_arr[$i]);//取得文件类型 
if(!is_array($filePath)) 
{ 
$fileNewName_str=$filePath.'-'.($j).'.'.$fileType_str; 
} 
else 
{ 
$fileNewName_str=$filePath_arr[$i].'.'.$fileType_str; 
} 
copy($fileTempName_arr[$i],$fileNewName_str);//上传文件 
unlink($fileTempName_arr[$i]);//删除缓存文件 
//---------------存储文件信息--------------------// 
$doFile_arr=explode('/',$fileNewName_str); 
$doFile_num_int=count($doFile_arr)-1; 
$reFileInfo_arr[$j]['name']=$doFile_arr[$doFile_num_int]; 
$reFileInfo_arr[$j]['type']=$fileType_str; 
$reFileInfo_arr[$j]['size']=$this->change_size_express($fileSize_arr[$i]); 
} 
} 
return $reFileInfo_arr; 
} 
/******************备份文件夹*********************/ 
} 
?>

希望对你有用.
PHP 相关文章推荐
PHP 和 MySQL 基础教程(三)
Oct 09 PHP
php读取数据库信息的几种方法
May 24 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP笔记之:基于面向对象设计的详解
May 14 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
精美漂亮的php分页类代码
Apr 02 #PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 #PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 #PHP
PHP 数组和字符串互相转换实现方法
Mar 26 #PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 #PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 #PHP
自定义php类(查找/修改)xml文档
Mar 26 #PHP
You might like
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python中字符串前面加r的作用
2015/06/04 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python实现银行管理系统
2019/10/25 Python
django中的数据库迁移的实现
2020/03/16 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
学习计划书怎么写
2014/09/15 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
公司仓库管理制度
2015/08/04 职场文书
《春酒》教学反思
2016/02/22 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL