PHP Filesystem 函数

Filesystem 函数允许您访问和操作文件系统,包括文件的读取、写入、复制、删除等操作。

PHP Filesystem 简介

Filesystem 函数允许您访问和操作文件系统。这些函数提供了强大的文件操作能力,包括:

  • 文件的创建、读取、写入和删除
  • 目录的创建、遍历和删除
  • 文件权限和属性的管理
  • 文件上传和下载
  • 文件锁定和并发控制

安装说明

Filesystem 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

检查文件系统支持

所有文件系统函数都是PHP核心功能的一部分,无需额外配置即可使用。

运行时配置

Filesystem 函数的行为受到 php.ini 中设置的影响。

Filesystem 配置选项:

名称 默认 描述 可改变
allow_url_fopen "1" 允许 fopen()-type 函数使用 URL。(PHP 4.0.4 版以后可用) PHP_INI_SYSTEM
user_agent NULL 定义 PHP 发送的用户代理。(PHP 4.3 版以后可用) PHP_INI_ALL
default_socket_timeout "60" 设置基于 socket 流的默认的超时时间(秒)。(PHP 4.3 版以后可用) PHP_INI_ALL
from "" 定义匿名 FTP 的密码(您的 email 地址)。 PHP_INI_ALL
auto_detect_line_endings "0" 当设置为 "1" 时,PHP 将检查通过 fgets() 和 file() 取得的数据中的行结束符号是符合 Unix、MS-Dos 还是 Mac 的习惯。(PHP 4.3 版以后可用) PHP_INI_ALL

Unix / Windows 兼容性

当在 Unix 平台上规定路径时,正斜杠 (/) 用作目录分隔符。而在 Windows 平台上,正斜杠 (/) 和反斜杠 (\) 均可使用。

跨平台兼容性提示
  • 使用 DIRECTORY_SEPARATOR 常量来处理路径分隔符
  • 使用 PATH_SEPARATOR 常量来处理路径列表分隔符
  • 避免硬编码路径分隔符(如 / 或 \)
  • 使用 realpath() 来获取规范的绝对路径

PHP Filesystem 函数列表

共收录 80+ 个文件系统函数
函数 描述 版本
basename() 返回路径中的文件名部分。 PHP 4+
chgrp() 改变文件组。 PHP 4+
chmod() 改变文件模式。 PHP 4+
chown() 改变文件所有者。 PHP 4+
clearstatcache() 清除文件状态缓存。 PHP 4+
copy() 复制文件。 PHP 4+
dirname() 返回路径中的目录名称部分。 PHP 4+
disk_free_space() 返回目录的可用空间。 PHP 5+
disk_total_space() 返回一个目录的磁盘总容量。 PHP 5+
diskfreespace() disk_free_space() 的别名。 PHP 4+
fclose() 关闭打开的文件。 PHP 4+
feof() 测试文件指针是否到了文件末尾。 PHP 4+
fflush() 向打开的文件刷新缓冲输出。 PHP 4+
fgetc() 从打开的文件中返回字符。 PHP 4+
fgetcsv() 从打开的文件中解析一行,校验 CSV 字段。 PHP 4+
fgets() 从打开的文件中返回一行。 PHP 4+
fgetss() 从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签。 PHP 4+
file() 把文件读入一个数组中。 PHP 4+
file_exists() 检查文件或目录是否存在。 PHP 4+
file_get_contents() 把文件读入字符串。 PHP 4.3+
file_put_contents() 把字符串写入文件。 PHP 5+
fileatime() 返回文件的上次访问时间。 PHP 4+
filectime() 返回文件的上次修改时间。 PHP 4+
filegroup() 返回文件的组 ID。 PHP 4+
fileinode() 返回文件的 inode 编号。 PHP 4+
filemtime() 返回文件内容的上次修改时间。 PHP 4+
fileowner() 返回文件的用户 ID(所有者)。 PHP 4+
fileperms() 返回文件的权限。 PHP 4+
filesize() 返回文件大小。 PHP 4+
filetype() 返回文件类型。 PHP 4+
flock() 锁定或释放文件。 PHP 4+
fnmatch() 根据指定的模式来匹配文件名或字符串。 PHP 4.3+
fopen() 打开一个文件或 URL。 PHP 4+
fpassthru() 从打开的文件中读数据,直到文件末尾(EOF),并向输出缓冲写结果。 PHP 4+
fputcsv() 把行格式化为 CSV 并写入一个打开的文件中。 PHP 5+
fputs() fwrite() 的别名。 PHP 4+
fread() 读取打开的文件。 PHP 4+
fscanf() 根据指定的格式对输入进行解析。 PHP 4+
fseek() 在打开的文件中定位。 PHP 4+
fstat() 返回关于一个打开的文件的信息。 PHP 4+
ftell() 返回在打开文件中的当前位置。 PHP 4+
ftruncate() 把打开文件截断到指定的长度。 PHP 4+
fwrite() 写入打开的文件。 PHP 4+
glob() 返回一个包含匹配指定模式的文件名/目录的数组。 PHP 4+
is_dir() 判断文件是否是一个目录。 PHP 4+
is_executable() 判断文件是否可执行。 PHP 4+
is_file() 判断文件是否是常规的文件。 PHP 4+
is_link() 判断文件是否是连接。 PHP 4+
is_readable() 判断文件是否可读。 PHP 4+
is_uploaded_file() 判断文件是否是通过 HTTP POST 上传的。 PHP 4+
is_writable() 判断文件是否可写。 PHP 4+
is_writeable() is_writable() 的别名。 PHP 4+
lchgrp() 改变符号连接的组所有权。 PHP 5.1+
lchown() 改变符号连接的用户所有权。 PHP 5.1+
link() 创建一个硬连接。 PHP 4+
linkinfo() 返回有关一个硬连接的信息。 PHP 4+
lstat() 返回关于文件或符号连接的信息。 PHP 4+
mkdir() 创建目录。 PHP 4+
move_uploaded_file() 把上传的文件移动到新位置。 PHP 4+
parse_ini_file() 解析一个配置文件。 PHP 4+
parse_ini_string() 解析一个配置字符串。 PHP 5.3+
pathinfo() 返回关于文件路径的信息。 PHP 4+
pclose() 关闭由 popen() 打开的进程。 PHP 4+
popen() 打开一个进程。 PHP 4+
readfile() 读取一个文件,并写入到输出缓冲。 PHP 4+
readlink() 返回符号连接的目标。 PHP 4+
realpath() 返回绝对路径名。 PHP 4+
realpath_cache_get() 返回高速缓存条目。 PHP 5.3+
realpath_cache_size() 返回高速缓存大小。 PHP 5.3+
rename() 重命名文件或目录。 PHP 4+
rewind() 倒回文件指针的位置。 PHP 4+
rmdir() 删除空的目录。 PHP 4+
set_file_buffer() 设置已打开文件的缓冲大小。 PHP 4+
stat() 返回关于文件的信息。 PHP 4+
symlink() 创建符号连接。 PHP 4+
tempnam() 创建唯一的临时文件。 PHP 4+
tmpfile() 创建唯一的临时文件。 PHP 4+
touch() 设置文件的访问和修改时间。 PHP 4+
umask() 改变文件的文件权限。 PHP 4+
unlink() 删除文件。 PHP 4+
file_append_contents() 向文件追加内容。 PHP 7.1+
is_readable_real() 检查文件是否真正可读(绕过缓存)。 PHP 8.2+
is_writable_real() 检查文件是否真正可写(绕过缓存)。 PHP 8.2+

使用示例

基本文件操作
// 检查文件是否存在
if (file_exists('test.txt')) {
    echo "文件存在\n";
} else {
    echo "文件不存在\n";
}

// 获取文件大小
$size = filesize('test.txt');
echo "文件大小: " . $size . " 字节\n";

// 获取文件修改时间
$mtime = filemtime('test.txt');
echo "最后修改时间: " . date('Y-m-d H:i:s', $mtime) . "\n";

// 获取文件类型
$type = filetype('test.txt');
echo "文件类型: " . $type . "\n";
文件读写操作
// 写入文件
$content = "Hello, World!\nThis is a test file.";
file_put_contents('test.txt', $content);

// 读取整个文件
$content = file_get_contents('test.txt');
echo "文件内容:\n" . $content . "\n";

// 逐行读取文件
$lines = file('test.txt');
echo "文件行数: " . count($lines) . "\n";
foreach ($lines as $line_num => $line) {
    echo "行 {$line_num}: " . htmlspecialchars($line) . "\n";
}

// 使用 fopen/fread/fwrite
$handle = fopen('test.txt', 'r+');
if ($handle) {
    // 读取前10个字符
    $data = fread($handle, 10);
    echo "前10个字符: " . $data . "\n";

    // 移动到文件末尾
    fseek($handle, 0, SEEK_END);

    // 写入内容
    fwrite($handle, "\n追加的内容");

    // 关闭文件
    fclose($handle);
}
目录和路径操作
// 获取当前目录
echo "当前目录: " . getcwd() . "\n";

// 创建目录
if (!file_exists('new_directory')) {
    mkdir('new_directory', 0755, true);
    echo "目录创建成功\n";
}

// 遍历目录
$files = scandir('.');
echo "当前目录文件:\n";
foreach ($files as $file) {
    if ($file != "." && $file != "..") {
        echo $file . "\n";
    }
}

// 路径信息
$path = '/var/www/html/test.php';
$info = pathinfo($path);
echo "路径信息:\n";
print_r($info);

// 获取绝对路径
$real = realpath('test.txt');
echo "绝对路径: " . $real . "\n";
高级文件操作
// 文件锁定
$fp = fopen("lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // 排它锁
    fwrite($fp, "写入一些内容");
    fflush($fp); // 释放锁之前刷新输出
    flock($fp, LOCK_UN); // 释放锁
} else {
    echo "无法获取锁!";
}

fclose($fp);

// 临时文件
$temp = tmpfile();
fwrite($temp, "临时文件内容");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // 文件会自动删除

// CSV文件处理
// 写入CSV
$list = [
    ['ID', 'Name', 'Email'],
    [1, 'John Doe', 'john@example.com'],
    [2, 'Jane Smith', 'jane@example.com']
];

$fp = fopen('file.csv', 'w');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

// 读取CSV
$fp = fopen('file.csv', 'r');
while (($row = fgetcsv($fp)) !== false) {
    print_r($row);
}
fclose($fp);
最佳实践
  • 始终检查文件操作是否成功
  • 使用适当的错误处理机制
  • 对用户上传的文件进行严格验证
  • 使用绝对路径以避免路径相关的问题
  • 及时关闭打开的文件句柄
  • 对大文件使用流式读取,避免内存问题
  • 考虑使用文件锁定来处理并发访问
  • 定期清理临时文件
安全注意事项
  • 文件上传:验证文件类型、大小和内容
  • 路径遍历:防止用户输入包含../等路径遍历字符
  • 权限设置:为文件设置适当的权限(通常为644,目录为755)
  • 包含文件:避免使用用户输入作为包含文件的路径
  • 敏感信息:不要将敏感信息存储在可公开访问的目录中