PHP函数参考09-文件系统函数与扩展类
目录
目录
Directory类
注意:Directory 实例是通过调用 dir() 函数创建的,而不是 new 操作符。
- Directory::close — 释放目录句柄
- Directory::read — 从目录句柄中读取条目
- Directory::rewind — 倒回目录句柄
Directory类全貌:
Directory {
/* 属性 */
public string $path;
public resource $handle;
/* 方法 */
public close([ resource $dir_handle] ) : void
public read([ resource $dir_handle] ) : string
public rewind([ resource $dir_handle] ) : void
}
目录函数
- chdir — 改变目录
- chroot — 改变根目录
- closedir — 关闭目录句柄
- dir — 返回一个 Directory 类实例
- getcwd — 取得当前工作目录
- opendir — 打开目录句柄
- readdir — 从目录句柄中读取条目
- rewinddir — 倒回目录句柄
- scandir — 列出指定路径中的文件和目录
opendir、readdir、scandir、closedir等目录函数实现和Directory类相同的功能。
$dir = "/tmp/";
if ($handle = opendir($dir)) {
echo "Directory handle: $handle\n";
echo "Files:\n";
/* 这是正确地遍历目录方法 */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}
closedir($handle);
}
$files = scandir($dir);
print_r($files);
Fileinfo
本模块中的函数通过在文件的给定位置查找特定的 magic.mime来猜测文件的内容类型以及编码。虽然不是百分百的精确,但是通常情况下能够很好的工作。
常用的函数有:finfo_open、finfo_file、finfo_close、mime_content_type
$finfo = finfo_open(FILEINFO_MIME_TYPE); // 返回 mime 类型资源
//遍历当下目录文件
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";//判断每个文件的mimetype
}
finfo_close($finfo);
echo "\n\n";
echo mime_content_type('test.zip') . "\n";
echo mime_content_type('test.php') . "\n";
php还提供了finfo类,也是对上面函数的改造,采用对象的方式实现。
xattr扩展
xattr扩展允许对文件系统上的扩展属性进行操作。
需要额外安装pecl扩展。
xattr扩展函数很简单:
- xattr_set:为文件设置扩展属性信息
- xattr_get:获取文件曾设置过的扩展属性信息
- xattr_remove:删除文件扩展属性信息
- xattr_list:文件扩展属性信息列表
- xattr_supported:检查文件系统是否支持扩展信息
$file = 'some_file';
if(xattr_supported($file)){
echo "文件系统支持扩展属性信息xattr\n";
}else{
echo "文件系统不支持扩展属性信息xattr\n";
exit;
}
xattr_set($file,'Artist',"Someone");
xattr_set($file,'Rank',"123");
echo xattr_get($file,"Rank",XATTR_ROOT);
$attributes = xattr_list($file);
foreach ($attributes as $attr_name) {
xattr_remove($file, $attr_name);
}
xdiff
xdiff扩展使您能够创建和应用补丁文件,其中包含不同版本文件之间的差异。
这个扩展支持两种操作模式:字符串和文件,以及两种不同的补丁格式:统一和二进制。统一补丁非常适合于文本文件,因为它们易于阅读且易于检查。对于像档案或图像这样的二进制文件,二进制补丁将是足够的选择,因为它们是二进制安全的,并且可以很好地处理不可打印的字符。
需要额外安装pecl扩展。
文件系统函数
文件系统是文件系统相关扩展的核心部分。有很多很常用的函数,这里将看起来熟悉又陌生的函数再梳理一下:
-
basename — 返回路径中的文件名部分
basename() 纯粹基于输入字符串操作,它不会受实际文件系统和类似 “..” 的路径格式影响。
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。dirname函数也一样。
echo basename("/etc/sudoers.d", ".d").PHP_EOL; //1) sudoers
-
dirname — 返回路径中的目录部分
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名,且目录深度为 levels 级,也就是要向上的父目录数量,默认是上1级(levels)
dirname() 纯粹基于输入字符串操作,且与斜线有关。在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。
echo dirname("/usr/local/lib"); //输出:/usr/local echo dirname("/usr/local/lib", 2); //输出:/usr
-
pathinfo — 返回文件路径的信息
pathinfo( string $path[, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME] ) : mixed
pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options。
同时关注:dirname、basename、realpath、parse_url函数
-
chgrp — 改变文件所属的组
只有超级用户可以任意修改文件的组,其它用户可能只能将文件的组改成该用户自己所在的组。
-
chmod — 改变文件模式
第二个参数只支持八进制:0755,0644等
chmod("/somedir/somefile", 0755); // 八进制数,正确的 mode 值 chmod("/somedir/somefile", 755); // 十进制数,可能不对 chmod("/somedir/somefile", "u+rwx,go+rx"); // 字符串,不对
-
chown — 改变文件的所有者
只有超级用户可以改变文件的所有者。
-
clearstatcache — 清除文件状态缓存
当使用 stat(),lstat() 或者任何列在受影响函数表(见下面)中的函数时,PHP 将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清除被缓存的信息。例如如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清除文件状态缓存。这种情况下,可以用 clearstatcache() 函数来清除被 PHP 缓存的该文件信息。
-
copy — 拷贝文件
-
delete — 参见 unlink 或 unset
在 PHP 语言里,没有 delete 关键词或函数。在这里,你若要删除文件,可以使用 unlink()。在本地作用域删除变量可使用 unset()。
-
disk_free_space — 返回目录中的可用空间
-
disk_total_space — 返回一个目录的磁盘总大小
-
diskfreespace — disk_free_space 的别名
-
fclose — 关闭一个已打开的文件指针
-
feof — 测试文件指针是否到了文件结束的位置
-
fflush — 将缓冲内容输出到文件
-
fgetc — 从文件指针中读取字符
返回一个包含有一个字符的字符串,该字符从 handle 指向的文件中得到。碰到 EOF 则返回 FALSE。
-
fgets — 从文件指针中读取一行
从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer; }
-
fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
和 fgets() 相同,只除了 fgetss() 尝试从读取的文本中去掉任何 HTML 和 PHP 标记。
$handle = fopen("./test.html","r"); if($handle){ while(false !== ($line = fgetss($handle, 1024))){ echo $line.PHP_EOL; } }
-
fread — 读取文件(可安全用于二进制文件)
可安全用于二进制文件。
-
fputs — fwrite 的别名
可安全用于二进制文件。
-
fwrite
可安全用于二进制文件。
fwrite() 把 string 的内容写入文件指针 handle 处。
-
fgetcsv — 从文件指针中读入一行并解析 CSV 字段
和 fgets() 类似,只除了 fgetcsv() 解析读入的行并找出 CSV 格式的字段然后返回一个包含这些字段的数组。
返回一个数组。
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { ... }
-
fputcsv — 将行格式化为 CSV 并写入文件指针
fputcsv() 将一行(用 fields 数组传递)格式化为 CSV 格式并写入由 handle 指定的文件
-
file_exists — 检查文件或目录是否存在
对于符号链接的文件,如果指向文件不存在,即使符号链接文件存在,该函数仍然判断为文件不存在。
-
file_get_contents — 将整个文件读入一个字符串
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。
// Read 14 characters starting from the 21st character $section = file_get_contents('./people.txt', NULL, NULL, 20, 14);
虽然该函数支持stream contexts,但对于http协议,我们还是建议采用比较友好的包,比如guzzle
-
file_put_contents — 将一个字符串写入文件
和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
如果filename不存在,则创建该文件。否则,现有的文件将被覆盖,除非设置了FILE_APPEND标志。
-
file — 把整个文件读入一个数组中
file( string $filename[, int $flags = 0[, resource $context]] ) : array
与file_get_content是一样的,只是返回的类型不一样,一个是数组,一个是字符串。
在$flags参数可以设置FILE_SKIP_EMPTY_LINES跳过空行,设置FILE_IGNORE_NEW_LINES 忽略换行符。
同样也支持流上下文:
$trimmed = file('http://www.example.com/', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
-
fileatime — 取得文件的上次访问时间
-
filectime — 取得文件的 inode 修改时间
注意是文件inode的修改时间,而不是文件的创建时间,也不是web上所想要的文件修改时间。
在大多数 Unix 文件系统中,当一个文件的 inode 数据被改变时则该文件被认为是修改了。也就是说,当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时。
注意某些 Unix 说明文本中把 ctime 说成是该文件建立的时间,这是错的。在大多数 Unix 文件系统中没有 Unix 文件的建立时间。
-
filegroup — 取得文件的组
-
fileinode — 取得文件的 inode
-
filemtime — 取得文件修改时间
本函数返回文件中的数据块上次被写入的时间,也就是说,文件的内容上次被修改的时间。
这个是区别于filectime函数(获取inode的上次修改时间)。
注意:此函数的结果会被缓存。有需要时,可以紧跟clearstatcache函数。
-
fileowner — 取得文件的所有者
-
fileperms — 取得文件的权限
-
filesize — 取得文件大小
-
filetype — 取得文件类型
注意:以上从fileatime开始到filetype函数,这些函���都是和文件相关信息的获取,都会被缓存。
-
flock — 轻便的访问文件锁定
flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型。
在文件资源句柄关闭时不会自动解锁,需要手动解锁。
flock( resource $handle, int $operation[, int &$wouldblock] ) : bool
operation 可以是以下值之一:
- LOCK_SH取得共享锁定(读取的程序)。
- LOCK_EX 取得独占锁定(写入的程序。
- LOCK_UN 释放锁定(无论共享或独占)。
-
fnmatch — 用模式匹配文件名
-
fopen — 打开文件或者 URL
fopen() 将 filename 指定的名字资源绑定到一个流上。
- ‘r+’ 读写方式打开,将文件指针指向文件头。
- ‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
- ‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
- ‘b’ 打开是否为二进制,用“b”标识;可以结合rb、wb、ab
- ‘t’ 打开为文本文件,可以结合rt、wt、at
为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 ‘b’ 标记。
$handle = fopen("/home/rasmus/file.gif", "wb");
-
fpassthru — 输出文件指针处的所有剩余数据
-
fscanf — 从文件中格式化输入
每次调用 fscanf() 都会从文件中读取一行。
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) { list ($name, $profession, $countrycode) = $userinfo; //... do something with the values }
-
fseek — 在文件指针中定位
-
fstat — 通过已打开的文件指针取得文件信息
获取由文件指针 handle 所打开文件的统计信息。本函数和 stat() 函数相似,除了它是作用于已打开的文件指针而不是文件名。
-
ftell — 返回文件指针读/写的位置
-
ftruncate — 将文件截断到给定的长度
-
glob — 寻找与模式匹配的文件路径
foreach (glob("/tmp/*.php") as $filename) { echo "$filename size " . filesize($filename) . PHP_EOL; }
-
is_dir — 判断给定文件名是否是一个目录
-
is_executable — 判断给定文件名是否可执行
-
is_file — 判断给定文件名是否为一个正常的文件
因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果。
-
is_link — 判断给定文件名是否为一个符号连接
-
is_readable — 判断给定文件名是否可读
记住 PHP 也许只能以运行 webserver 的用户名(比如 ‘nobody’,‘www-data’等)来访问文件.
-
is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
-
is_writable — 判断给定的文件名是否可写
-
is_writeable — is_writable 的别名
-
lchgrp — 修改符号链接的所有组
-
lchown — 修改符号链接的所有者
-
link — 建立一个硬连接
-
linkinfo — 获取一个连接的信息
-
lstat — 给出一个文件或符号连接的信息
获取由 filename 指定的文件或符号连接的统计信息。
本函数和 stat() 函数相同,只除了如果 filename 参数是符号连接的话,则该符号连接的状态被返回,而不是该符号连接所指向的文件的状态。
注意:符号链接文件(不是硬链接)和指向文件的inode是不一样的,所以stat和lstat对于同一个符号链接文件输出的统计信息是不一样的,stat统计的是符号链接文件指向的源文件,lstat统计的是符号链接本身文件。
-
mkdir — 新建目录
一定要确保有操作权限,另外mkdir第二个参数支持mode的修改,第三个参数支持嵌套创建不存在的目录。
if (!mkdir($structure, 0777, true)) { die('Failed to create folders...'); }
-
move_uploaded_file — 将上传的文件移动到新位置
-
parse_ini_file — 解析一个配置文件
parse_ini_file() 载入一个由 filename 指定的 ini 文件,并将其中的设置作为一个联合数组返回。
注意:ini 文件的结构和 php.ini 的相似。
比如:
; This is a sample configuration file ; Comments start with ';', as in php.ini [first_section] one = 1 five = 5 animal = BIRD [second_section] path = "/usr/local/bin" URL = "http://www.example.com/~username"
第二个参数为true支持返回多维数组:
$ini_array = parse_ini_file("sample.ini", true); print_r($ini_array); 输出: Array ( [first_section] => Array ( [one] => 1 [five] => 5 [animal] => Dodo bird ) [second_section] => Array ( [path] => /usr/local/bin [URL] => http://www.example.com/~username ) )
-
parse_ini_string — 解析配置字符串
同parse_ini_file,只不过输入是字符串而不是ini文件。
字符串格式仍然与php.ini类似。
-
popen — 打开进程文件指针
返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。当模式为 ‘r’,返回的文件指针等于命令的 STDOUT,当模式为 ‘w’,返回的文件指针等于命令的 STDIN。
$handle = popen("/bin/ls", "r");
如果需要双向支持,使用 proc_open()。
-
pclose — 关闭进程文件指针
-
readfile — 输出文件
读取文件并写入到输出缓冲。
-
readlink — 返回符号连接指向的目标
readlink() 和同名的 C 函数做同样的事,返回符号连接的内容。
符号连接的内容其实是指向文件的名称。
-
realpath_cache_get — 获取真实目录缓存的详情
-
realpath_cache_size — 获取真实路径缓冲区的大小
-
realpath — 返回规范化的绝对路径名
就是绝对路径的返回。
-
rename — 重命名一个文件或目录
尝试把 oldname 重命名为 newname,必要时会在不同目录间移动。如果重命名文件时 newname 已经存在,将会覆盖掉它。如果重命名文件夹时 newname 已经存在,本函数将导致一个警告。
-
rewind — 倒回文件指针的位置
倒回的意思就是将 handle 的文件位置指针设为文件流的开头。
-
rmdir — 删除目录
和linux命令rmdir是一样的,尝试删除 dirname 所指定的目录。该目录必须是空的,而且要有相应的权限。
-
set_file_buffer — stream_set_write_buffer 的别名
-
stat — 给出文件的信息
获取由 filename 指定的文件的统计信息。如果 filename 是符号连接,则统计信息是关于被连接文件本身的,而不是符号连接。可以参考lstat。
-
symlink — 建立符号连接
首先要弄清楚硬连接与符号连接的区别。
通过link函数创建硬连接。
-
tempnam — 建立一个具有唯一文件名的文件
在指定目录中建立一个具有唯一文件名的文件。如果该目录不存在,tempnam() 会在系统临时目录中生成一个文件,并返回其文件名。
-
tmpfile — 建立一个临时文件
以读写(w+)模式建立一个具有唯一文件名的临时文件,返回一个文件句柄。
文件会在关闭后(用 fclose())自动被删除,或当脚本结束后。
-
touch — 设定文件的访问和修改时间
touch( string $filename[, int $time = time()[, int $atime]] ) : bool
尝试将由 filename 给出的文件的访问和修改时间设定为给出的 time。注意访问时间总是会被修改的,不论有几个参数。
-
umask — 改变当前的 umask
不清楚linux的umask的话,不建议随便改动。Linux umask命令 | 菜鸟教程
umask() 将 PHP 的 umask 设定为 mask & 0777 并返回原来的 umask。当 PHP 被作为服务器模块使用时,在每个请求结束后 umask 会被恢复。
假设当前系统的umask是022,则通过mkdir创建目录的权限为:
"drwxr-xr-x" = "777-022 = 755"
-
unlink — 删除文件