在 PHP 中处理文件系统:主要函数与示例
文件系统操作是 Web 开发中的关键任务之一。PHP 提供了一套强大且灵活的函数,用于创建、读取、写入、删除文件和文件夹,以及管理访问权限。在本文中,我们将介绍 PHP 处理文件系统的主要功能,提供实际示例,并讨论常见错误。
1. 在 PHP 中读取文件
PHP 支持多种从文件读取数据的方式。选择哪种方法取决于文件大小和所需的控制级别。
1.1. file_get_contents() 函数
将整个文件读取到字符串中最简单的方法是使用 file_get_contents()。此函数适用于小文件(如配置文件、模板)。
<?php// 将整个文件读取到字符串中$content = file_get_contents('data.txt');if ($content !== false) { echo "文件内容: " . htmlspecialchars($content);} else { echo "读取文件时出错";}?>1.2. file() 函数
如果需要将文件内容作为字符串数组获取(每行一个元素),请使用 file()。
<?php$lines = file('log.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);foreach ($lines as $lineNum => $line) { echo "行 " . ($lineNum + 1) . ": " . htmlspecialchars($line) . "<br>";}?>1.3. 使用 fopen() + fgets() 逐行读取
对于大文件(例如日志),最好使用流式读取,以避免将整个文件保留在内存中。
<?php$handle = fopen('large_file.csv', 'r');if ($handle) { while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer . "<br>"; } fclose($handle);} else { echo "无法打开文件";}?>2. 将数据写入文件
写入操作也可以通过不同方式执行。主要区别在于覆盖文件还是追加到末尾。
2.1. file_put_contents() 函数
将字符串写入文件的快速方法。如果文件不存在,则会创建它。默认情况下,文件会被覆盖。
<?php$data = "新记录: " . date('Y-m-d H:i:s') . "";// 覆盖文件file_put_contents('log.txt', $data);// 追加到末尾(使用 FILE_APPEND 标志)file_put_contents('log.txt', $data, FILE_APPEND);?>2.2. 通过 fopen() + fwrite() 手动写入
为了进行精细控制(例如文件锁定),请使用 fopen() / fwrite() 组合。
<?php$filename = 'counter.txt';$handle = fopen($filename, 'c+'); // 'c+' — 如果文件不存在则创建if (flock($handle, LOCK_EX)) { // 独占锁定 $current = (int) fread($handle, filesize($filename) ?: 1); $current++; ftruncate($handle, 0); // 清空文件 rewind($handle); fwrite($handle, $current); flock($handle, LOCK_UN); // 解除锁定}fclose($handle);echo "计数器: $current";?>3. 处理目录
PHP 不仅可以管理文件,还可以创建、删除和浏览文件夹。
3.1. 创建文件夹 (mkdir)
<?php// 创建一个文件夹if (!is_dir('uploads')) { mkdir('uploads', 0755);}// 递归创建嵌套文件夹(PHP 5.4+)mkdir('images/2024/12', 0755, true);?>3.2. 删除文件夹 (rmdir)
rmdir() 仅删除空文件夹。要删除包含所有内容的文件夹,需要一个递归函数。
<?phpfunction deleteDirectory($dir) { if (!file_exists($dir)) { return true; } if (!is_dir($dir)) { return unlink($dir); } $items = array_diff(scandir($dir), ['.', '..']); foreach ($items as $item) {
```