PHP目录与文件操作核心函数详解

认真发呆
认真发呆
发布时间:2026-10-16| 5人浏览过
原创

掌握PHP中的目录与文件操作是后端开发的基石。本文详细解析了从基础的路径提取到高级的文件读写与锁定机制,提供实用的代码示例,帮助开发者高效处理本地文件系统任务。

一、 路径与目录信息提取

在操作文件前,通常需要对路径字符串进行解析。PHP提供了几个内置函数来获取路径的不同部分:

  • basename():返回包含文件扩展名的文件名部分。
  • dirname():返回文件所在的目录路径部分。
  • pathinfo():返回包含路径信息的数组,包括dirname、basename、extension和filename。
  • realpath():将相对路径转换为规范的绝对路径,解决符号链接和..等问题。

第1步:使用路径函数获取文件信息

目的:理解如何从完整路径中提取所需的路径片段。

操作:首先通过realpath()确定文件绝对路径,然后依次调用其他函数。

<?php
$path = 'demo1.php';
// 获取规范化的绝对路径
$path = realpath($path);

// 输出基本信息
echo basename($path) . '<br>';      // 输出: demo1.php
echo dirname($path) . '<br>';     // 输出: D:\AppServ\www\Basic6

// 获取详细信息数组
$array_path = pathinfo($path);
echo 'basename : ' . $array_path['basename'] . '<br>';
echo 'dirname : ' . $array_path['dirname'] . '<br>';
echo 'extension : ' . $array_path['extension'] . '<br>';
echo 'filename : ' . $array_path['filename'] . '<br>';
?>

二、 磁盘空间与文件状态查询

了解文件的物理属性和系统盘状态对于资源监控和校验非常重要。

第2步:查看文件大小与磁盘剩余空间

目的:获取特定文件的大小以及指定磁盘分区的总容量和可用空间。

参数说明:disk_free_space和disk_total_space接收驱动器字母(如'c:')作为参数。

<?php
$path = 'demo2.php';
$path = realpath($path);
$drive = 'c:';

// 计算并格式化输出
// 文件大小转为KB
$fileSize = round(filesize($path) / 1024, 2);
echo $fileSize . 'kb<br/>';

// 磁盘空间转为GB(1GB = 1024*1024*1024 Bytes)
$freeSpace = round(disk_free_space($drive) / 1024 / 1024 / 1024, 2);
echo $freeSpace . 'GB<br/>';

$totalSpace = round(disk_total_space($drive) / 1024 / 1024 / 1024, 2);
echo $totalSpace . 'GB<br/>';
?>

第3步:获取文件的时间戳

Linux/Unix系统中inode修改时间常被误解,需注意区分:

  • fileatime():最后一次访问时间,即读取该文件内容的时间。
  • filemtime():最后修改时间,即文件内容被写入或覆盖的时间。
  • filectime():最后改变时间,指文件元数据(如权限、所有者、inode信息)变更的时间。在Windows上这通常等同于修改时间,但在Linux上完全不同。
<?php
$file = realpath('../Basic5/demo3.php');
$date_format = 'Y-m-d h:i:s';

echo 'lastest accessing time : ' . date($date_format, fileatime($file)) . '<br>';
echo 'lastest change time (metadata) : ' . date($date_format, filectime($file)) . '<br>';
echo 'lastest modify time (content) : ' . date($date_format, filemtime($file)) . '<br>';
?>

三、 文件读写操作详解

文件处理是PHP最核心的功能之一。主要分为“传统流式IO”和“PHP5+简化IO”两种方式。

第4步:传统流式文件打开与关闭

所有PHP版本均支持。核心流程是:打开(fopen) → 读写(fwrite/fread) → 关闭(fclose)。

fopen() 常用模式参数:

模式说明
'r'只读,指针指向文件头。
'w'写入。清空文件内容,若不存在则创建。指针指向文件头。
'a'追加写入。若不存在则创建。指针指向文件末尾。
'x'创建并以写入方式打开。如果文件已存在,则失败(返回FALSE)。用于确保不覆盖已有文件。
'r+'读写,指针指向文件头。
'w+'读写,清空文件。
'a+'读写,指针指向文件末尾(追加)。也可读取,但只能从末尾写。
<?php
// 写入示例:使用 'w' 模式会清空原文件
$fp = fopen('file1.txt', 'w');
$outStr = "my name is anllin,\r\nmy age is 29.";
fwrite($fp, $outStr, strlen($outStr));
 fclose($fp);
?>

第5步:PHP5+ 便捷文件写入函数

file_put_contents() 将文件打开、写入和关闭的操作合并为一行,更加简洁。

<?php
// 直接写入字符串到文件,不存在则创建,存在则覆盖
file_put_contents('file2.txt', "my name is anllin,\r\nmy age is 29.");
?>

第6步:常见的文件读取方法对比

根据需求选择合适的方法:

  • 按字符/行读取:
    - fgetc($fp):每次读取一个字符。
    - fgets($fp, length?):每次读取一行,可选长度限制。
  • 安全读取:
    - fgetss($fp):读取一行并过滤掉HTML标记(较旧的功能,安全性有限,现代开发建议结合 htmlspecialchars 使用)。
  • 批量/全文读取:
    - fread($fp, length):读取指定字节数。
    - file($filename):将整个文件读入一个数组,每行一个元素。
    - file_get_contents($filename):将全部文件内容读为一个字符串。**推荐用于小文件**。
  • 直接输出:
    - readfile($filename):读取文件并直接写到输出缓冲(浏览器),同时返回字节数。
<?php
// 示例:读取整个文件内容为字符串(最常用)
$contents = file_get_contents('file1.txt');
echo $contents;

// 示例:逐行读取并处理
$lines = file('file1.txt');
foreach ($lines as $line_num => $line) {
    echo "$line_num : $line<br>";
}
?>

第7步:判断文件存在性与大小

在执行操作前检查文件是否存在是良好的编程习惯。

<?php
$filename = 'file1.txt';
if (file_exists($filename)) {
    $size = filesize($filename); // 返回字节数
    echo "文件存在,大小: $size 字节<br>";
} else {
    echo '你要找的文件不存在';
}
?>

四、 文件指针控制与定位

在处理大文件或需要反复读取不同位置的数据时,精确控制文件指针是关键。

  • ftell($fp):返回当前文件指针的位置(偏移量)。
  • rewind($fp):将文件指针重置到文件开头。
  • fseek($fp, offset [, whence]):移动文件指针。例如 fseek($fp, 0) 等同于 rewind。
  • feof($fp):测试文件指针是否到了文件结束的地方(EOF),常用于 while 循环。
<?php
$fp = fopen('file1.txt', 'r');
fgetc($fp); // 读第一个字符
fgetc($fp); // 读第二个字符
echo ftell($fp) . '<br>'; // 输出 2

rewind($fp); // 重置指针
echo ftell($fp) . '<br>'; // 输出 0

// 使用 while 循环读取直到文件结束
rewind($fp);
while(!feof($fp)) {
    echo fgetc($fp);
}
fclose($fp);
?>

五、 文件删除与重命名

⚠️ 风险提醒:unlink() 和 rmdir() 是不可逆操作。在生产环境中执行删除前,请务必确认路径正确,最好先进行备份或有二次确认逻辑。
  • unlink($filename):删除文件。成功返回 1,失败返回 FALSE。
  • rename($oldname, $newname):重命名或移动文件/目录。
  • rmdir($dirname):删除目录。**仅当目录为空时才能成功**。
<?php
// 重命名示例
if (rename('demo1.php', 'demo01.php')) {
    if (file_exists('demo01.php')) {
        echo 'file rename success';
    }
}

// 删除空目录示例
// 注意:必须确保目录内无其他文件
$r = rmdir('empty_dir');
echo $r ? 'delete file success' : 'delete failed';
?>

六、 并发环境下的文件锁定

在多用户或多线程环境下读写同一文件可能导致数据损坏。PHP提供了 flock() 进行轻量级的文件锁定。

第8步:使用 flock 保护文件读写

主要锁定模式:

  • LOCK_SH:共享锁(读取锁)。允许其他进程也读取,互斥写入。
  • LOCK_EX:独占锁(写入锁)。排斥其他所有访问者,适用于写入操作。
  • LOCK_UN:解锁。
  • LOCK_NB:非阻塞模式。如果在请求加锁时发生阻塞,不会等待,而是立即返回 FALSE。
<?php
$filename = 'file1.txt';
$fp = fopen($filename, 'rb'); // 必须以可读或可写模式打开

// 获取独占锁(防止他人同时写入)
if (flock($fp, LOCK_EX)) {
    $contents = fread($fp, filesize($filename));
    
    // ... 在此处进行读取后的逻辑处理 ...

    // 释放锁
    flock($fp, LOCK_UN);
} else {
    echo "Failed to lock file!";
}
fclose($fp);
?>
以上就是PHP目录与文件操作的详细内容,更多关于PHP文件和目录处理的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。