目录

目录

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 — 删除文件