php 其他常用文件处理函数

来源:互联网 发布:怎么清理mac内存 编辑:程序博客网 时间:2024/06/05 02:35

5.6 其他常用文件处理函数
前面介绍了最常用的文件处理的函数,接下来介绍其他的一些常用函数,这些函数能够
帮助进行文件处理。
(1)filesize()函数。filesize 函数用于获取一个文件的大小。该函数声明如下:
int filesize ( string filename)
该函数返回文件大小的字节数,如果出错返回FALSE。
提示
因为 PHP 的整数类型是有符号的,并且大多数平台使用32 位整数,filesize()
函数在碰到大于2GB 的文件时可能会返回非预期的结果。对于2~4GB 之间的
文件,通常可以使用sprintf("%u", filesize($file))来克服此问题。
178 PHP 网络编程技术与实例
(2)unlink()函数。unlink 函数用于删除一个文件。该函数的声明如下:
bool unlink (string filename)
如果成功则返回TRUE,失败则返回FALSE。
(3)rmdir()函数。rmdir 函数用于删除一个目录。该函数声明如下:
bool rmdir (string dirname)
该函数尝试删除dirname 所指定的目录。该目录必须是空的,而且要有相应的权限。如
果成功则返回TRUE,失败则返回FALSE。
(4)mkdir()函数。mkdir 函数用于创建一个目录。该函数的声明如下:
bool mkdir (string pathname [, int mode])
尝试新建一个由pathname 指定的目录。mode 是指操作权限,默认的mode 是0777,表
示最大可能的访问权。
(5)basename 函数。该函数返回路径中的文件名部分。声明如下:
string basename ( string path [, string suffix])
path 参数给出一个包含有指向一个文件的全路径的字符串,函数返回基本的文件名。如
果文件名是以suffix 结束的,则这一部分也会被去掉。
在Windows 中,斜线(/)和反斜线(\)都可以用作路径分隔符。在其他环境下是斜线(/)。
该函数的示例如下:
<?php
$path = "/home/httpd/html/index.php";
$file = basename ($path); // $file is set to "index.php"
$file = basename ($path,".php"); // $file is set to "index"
?>
(6)dirname()函数。该函数返回路径中的目录部分。声明如下:
string dirname ( string path)
path 参数给出一个包含有指向一个文件的全路径的字符串,函数返回去掉文件名后的目
录名。示例如下:
<?php
$path = "/etc/passwd";
$file = dirname ($path); // $file is set to "/etc"
?>
提示
PHP 4.0.3 中,dirname()被修正为POSIX 兼容。本质上就意味着如果在path
中没有斜线,则返回一个点('.'),表示当前目录。否则返回的是把path 中结尾
的/component(最后一个斜线以及后面部分)去掉之后的字符串。这意味着在
老的函数返回一个空字符串的情形下从dirname()得到的是斜线或者一个点。
(7)pathinfo()函数。该函数返回文件路径的信息。声明如下:
array pathinfo ( string path)
pathinfo()返回一个数组包含有path 的信息,包括以下的数组单元dirname、basename 和
extension。示例如代码5-21 所示。
【代码 5-21】 pathinfo.php
<?php
$path_parts = pathinfo("/www/htdocs/index.html");
echo $path_parts["dirname"] ."<br>";
第5 章 PHP 中的文件处理技术 179
echo $path_parts["basename"]."<br>";
echo $path_parts["extension"]."<br>";
?>
以上代码输出结果为:
/www/htdocs
index.html
html
(8)realpathf()函数。该函数返回规范化的绝对路径名。函数声明如下:
string realpath ( string path)
realpath()扩展所有的符号连接并且处理输入的path 中的'/./', '/../'以及多余的'/'并返回规范
化后的绝对路径名。返回的路径中没有符号连接,'/./'或'/../'成分。
realpath()失败时返回FALSE,例如如果文件不存在的话。
(9)copy()函数。该函数复制文件。声明如下:
bool copy ( string source, string dest)
该函数将文件从source 复制到dest。如果成功则返回TRUE,失败则返回FALSE。
实例 5-19 文件复制
本实例演示如何进行文件复制,如代码5-22 所示。
【代码 5-22】 copy.php
<?php
if (!copy("readfile.php", 'temp.bak'))
print ("文件复制失败<br>\n");
else
print("文件复制成功!");
?>
执行结果如下所示:
文件复制成功!
(10)disk_free_space()函数。该函数返回目录中的可用空间。声明如下:
float disk_free_space ( string directory)
该函数给出一个包含有一个目录的字符串,函数将根据相应的文件系统或磁盘分区返回
可用的字节数。
实例 5-20 获取磁盘剩余空间
本实例使用disk_free_space 函数获取指定磁盘或者目录的剩余空间,如代码5-23
所示。
【代码 5-23】 disk_free_space.php
<?php
// $df 包含根目录下可用的字节数
$df = disk_free_space("/");
echo $df;
?>
执行结果如下:
12835323904
180 PHP 网络编程技术与实例
提示 本函数不能用于远程文件,被检查的文件必须通过服务器的文件系统访问。
(11)disk_total_space()函数。该函数返回目录的磁盘总大小。声明如下:
float disk_total_space ( string directory)
directory 参数给出一个包含有一个目录的字符串,函数将根据相应的文件系统或磁盘分
区返回所有的字节数。
实例 5-21 获取磁盘总空间
本实例使用disk_total_space 函数获取指定磁盘的总空间,如代码5-24 所示。
【代码 5-24】 disk_total_space.php
<?php
// $df 包含 "/" 目录的磁盘大小
$df = disk_total_space("/");
echo $df;
?>
执行结果如下:
20003848192
(12)file_put_contents()函数。该函数将一个字符串写入文件。声明如下:
int file_put_contents ( string filename, string data [, int flags [, resource
context]])
和依次调用fopen()、fwrite()以及fclose()功能一样。本函数返回写入文件的字节数。flags 可以
是FILE_USE_INCLUDE_PATH 和/或FILE_APPEND,但是使用FILE_USE_INCLUDE_PATH 选项
时要多加小心。
(13)fileatime()函数。该函数取得文件的上次访问时间。声明如下:
int fileatime ( string filename)
函数返回文件上次被访问的时间,如果出错则返回FALSE。时间以UNIX 时间戳的方式
返回。
注意
一个文件的 atime 应该在不论何时读取了此文件中的数据块时被更改。当一
个应用程序定期访问大量文件或目录时很影响性能。有些UNIX 文件系统在加
载时关闭atime 的更新以提高这类程序的性能。
实例 5-22 获取文件的上次访问时间
本实例演示了如何通过fileatime 函数获取文件的上次访问时间,如代码5-25 所示。
【代码 5-25】 fileatime.php
<?php
// 输出类似:December 29 2002 22:16:23.
$filename = 'hello/student.txt';
if (file_exists($filename)) {
echo "$filename 文件最近一次访问时间: " . date ("F d Y H:i:s.",
fileatime($filename));
}
第5 章 PHP 中的文件处理技术 181
?>
执行结果如下:
hello/student.txt 文件最近一次访问时间: December 04 2005 00:00:00.
(14)filemtime()函数。该函数取得文件修改时间,声明如下:
int filemtime ( string filename)
该函数返回文件上次被修改的时间,出错时返回FALSE。
实例 5-23 获取文件的最近修改时间
本实例演示了如何获取文件的最近修改时间,如代码5-26 所示。
【代码 5-26】 filemtime.php
<?php
// 输出: December 29 2002 22:16:23.
$filename = 'hello/student.txt';
if (file_exists($filename)) {
echo "$filename 最近修改时间: " . date ("F d Y H:i:s.", filemtime($filename));
}
?>
执行结果如下:
hello/student.txt 最近修改时间: October 02 2005 13:56:44.
(15)stat()函数。该函数给出文件的信息,函数声明如下:
array stat ( string filename)
该函数获取由filename 指定的文件的统计信息。如果filename 是符号连接,则统计信息
是关于被连接文件本身的,而不是符号连接。lstat()和stat()相同,除了stat 函数会返回符号
连接的状态。如果出错,stat()返回FALSE,并且发出一条警告。
返回一个数组包含的文件的统计信息,则该数组具有以下列出的单元,数组下标从 0 开
始。除了数字索引之外自PHP 4.0.6 以后还可以通过关联索引来访问。
stat()和fstat()返回格式如表5-2 所示。
表 5-2 stat()和fstat()返回格式
数字下标
关联键名
(自 PHP 4.0.6)
说 明数字下标
关联键名
(自 PHP 4.0.6)
说 明
0 dev 设备名7 size 文件大小的字节数
1 ino Inode 号码8 atime 上次访问时间(UNIX 时间戳)
2 mode inode 保护模式9 mtime 上次修改时间(UNIX 时间戳)
3 nlink 被连接数目10 ctime 上次改变时间(UNIX 时间戳)
4 uid 所有者的用户id 11 blksize 文件系统IO 的块大小
5 gid 所有者的组id 12 blocks 所占据块的数目
6 rdev 设备类型,如果是inode 设备
(16)fstat()函数。该函数通过已打开的文件指针取得文件信息,声明如下:
array fstat ( resource handle)
该函数获取由文件指针handle 所打开文件的统计信息。此函数和stat()函数相似,但fstat
函数用于已打开的文件指针而不是文件名。
函数的示例如代码 5-27 所示。
182 PHP 网络编程技术与实例
【代码 5-27】
<?php
// 打开文件
$fp = fopen("/etc/passwd", "r");
// 取得统计信息
$fstat = fstat($fp);
// 关闭文件
fclose($fp);
// 只显示关联数组部分
print_r(array_slice($fstat, 13));
?>
输出结果如下:
Array
(
[dev] => 771
[ino] => 488704
[mode] => 33188
[nlink] => 1
[uid] => 0
[gid] => 0
[rdev] => 0
[size] => 1114
[atime] => 1061067181
[mtime] => 1056136526
[ctime] => 1056136526
[blksize] => 4096
[blocks] => 8
)
(17)filetype()函数。该函数取得文件类型,声明如下:
string filetype ( string filename)
返回文件的类型。可能的值有fifo,char,dir,block,link,file 和unknown。如果出错则
返回FALSE。如果stat 调用失败或者文件类型未知,filetype()还会产生一个E_NOTICE 消息。
(18)is_dir()函数。该函数判断给定文件名是否是一个目录,声明如下:
bool is_dir ( string filename)
如果文件名存在并且为目录则返回TRUE。如果filename 是一个相对路径,则按照当前
工作目录检查其相对路径。
(19)flock()函数。该函数进行文件锁定,声明如下:
bool flock ( int handle, int operation [, int &wouldblock])
PHP 支持以咨询方式(也就是所有访问程序必须使用同一方式锁定,否则它不会工作)
锁定全部文件的一种轻便方法。
flock()操作的handle 必须是一个已经打开的文件指针。operation 可以是以下值之一。
要取得共享锁定(读取程序),将operation 设为LOCK_SH。
第5 章 PHP 中的文件处理技术 183
要取得独占锁定(写入程序),将operation 设为LOCK_EX。
要释放锁定(无论共享或独占),将operation 设为LOCK_UN。
如果不希望 flock()在锁定时堵塞,则可以给operation 加上LOCK_NB。
flock()允许执行一个简单的可以在任何平台中使用的读取/写入模型,(包括大部分的
UNIX 派生版甚至是Windows)。如果锁定堵塞(EWOULDBLOCK 错误码情况下),可将可
选的第三个参数设置为TRUE。
函数 flock 的示例如代码5-28 所示。
【代码 5-28】 flock.php
<?php
$fp = fopen("hello/student.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);
?>
提示
由于 flock()需要一个文件指针,因此可能需要一个锁定文件来保护到打算
通过写模式打开来截断的文件的访问(在fopen()函数中加入"w"或"w+")。
(20)is_uploaded_file 函数。该函数判断文件是否是通过HTTP POST 上传的。
bool is_uploaded_file ( string filename)
如果filename 所给出的文件是通过HTTP POST 上传的,则返回TRUE。这可以用来确保
恶意的用户无法欺骗脚本去访问本不能访问的文件。
(21)move_uploaded_file()函数。该函数将上传的文件移动到新位置。声明如下:
bool move_uploaded_file ( string filename, string destination)
本函数检查并确保由filename 指定的文件是合法的上传文件(即通过PHP 的HTTP POST
上传机制所上传的)。如果文件合法,则将其移动为由destination 指定的文件。
如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file()将返回
FALSE。
如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,
move_uploaded_file()将返回FALSE。此外还会发出一条警告。
如果目标文件已经存在,将会被覆盖。
提示
当安全模式(safe mode)被激活,PHP 将检查将要操作的文件或者目录与
正在执行的脚本是否有相同的UID。


0 0