PHP 基础教程
PHP 高级教程
PHP & MySQL DATABASE
PHP 示例
PHP 参考手册

PHP 文件系统

在本教程中,您将学习如何使用 PHP 的文件系统函数动态创建、访问(或读取)和操作文件。

在 PHP 中处理文件

由于 PHP 是一种服务器端编程语言,它允许您使用存储在 Web 服务器上的文件和目录。 在本教程中,您将学习如何使用 PHP 文件系统函数在 Web 服务器上创建、访问和操作文件。

使用 PHP fopen() 函数打开文件

要使用文件,您首先需要打开文件。 PHP fopen() 函数用于打开文件。 该函数的基本语法可以通过以下方式给出:

fopen(filename, mode)

传递给 fopen() 的第一个参数指定要打开的文件的名称,第二个参数指定应以哪种模式打开文件。 例如:

<?php
$handle = fopen("data.txt", "r");
?>

该文件可以以下模式之一打开:

模式 What it does
r 以只读方式打开文件。
r+ 打开文件进行读写。
w 打开只写文件并清除文件内容。 如果文件不存在,PHP 将尝试创建它。
w+ 打开文件进行读写并清除文件内容。 如果文件不存在,PHP 将尝试创建它。
a 附加。 打开文件仅用于写入。 通过写入文件末尾来保留文件内容。 如果文件不存在,PHP 将尝试创建它。
a+ 读取/附加。 打开文件进行读写。 通过写入文件末尾来保留文件内容。 如果文件不存在,PHP 将尝试创建它。
x 打开文件仅用于写入。 如果文件已存在,则返回 FALSE 并生成错误。 如果文件不存在,PHP 将尝试创建它。
x+ 打开文件进行读写; 否则,它的行为与 'x' 相同。

如果您尝试打开一个不存在的文件,PHP 将生成一条警告消息。 因此,为了避免这些错误消息,您应该在尝试访问文件或目录之前始终使用 PHP file_exists() 函数简单地检查文件或目录是否存在。

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 尝试打开文件
    $handle = fopen($file, "r");
} else{
    echo "ERROR: File does not exist.";
}
?>

提示:对文件和目录的操作容易出错。 因此,实现某种形式的错误检查是一种很好的做法,这样如果发生错误,您的脚本就会优雅地处理错误。 请参阅 PHP 错误处理 的教程。


使用 PHP fclose() 函数关闭文件

处理完文件后,需要将其关闭。 fclose() 函数用于关闭文件,如下例所示:

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 打开文件进行读取
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    /* 一些要执行的代码 */
        
    // 关闭文件句柄
    fclose($handle);
} else{
    echo "ERROR: File does not exist.";
}
?>

注意: 虽然 PHP 在脚本终止时会自动关闭所有打开的文件,但最好在执行完所有操作后关闭文件。


使用 PHP fread() 函数从文件中读取

现在您已经了解了如何打开和关闭文件。 在下一节中,您将学习如何从文件中读取数据。 PHP 有几个函数用于从文件中读取数据。 您可以通过一次操作从一个字符读取到整个文件。

读取固定数量的字符

fread() 函数可用于从文件中读取指定数量的字符。 可以给出这个函数的基本语法。

fread(file handle, length in bytes)

这个函数有两个参数 — 文件句柄和要读取的字节数。 以下示例从"data.txt"文件中读取 20 个字节,包括空格。 假设文件"data.txt"包含一段文本"The quick brown fox jumps over the lazy dog"。

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 打开文件进行读取
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // 从文件中读取固定数量的字节
    $content = fread($handle, "20");
        
    // 关闭文件句柄
    fclose($handle);
        
    // 显示文件内容echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子会产生如下输出:

The quick brown fox

读取文件的全部内容

fread() 函数可以与 filesize() 函数结合使用以一次读取整个文件。 filesize() 函数以字节为单位返回文件的大小。

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 打开文件进行读取
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // 读取整个文件
    $content = fread($handle, filesize($file));
        
    // 关闭文件句柄
    fclose($handle);
        
    // 显示文件内容echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子会产生如下输出:

The quick brown fox jumps over the lazy dog.

在 PHP 中读取文件全部内容的最简单方法是使用 readfile() 函数。 此功能允许您读取文件的内容而无需打开它。 以下示例将生成与上述示例相同的输出:

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 读取并输出整个文件
    readfile($file) or die("ERROR: Cannot open the file.");
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子会产生如下输出:

The quick brown fox jumps over the lazy dog.

另一种无需打开文件即可读取文件全部内容的方法是使用 file_get_contents() 函数。 此函数接受文件的名称和路径,并将整个文件读入字符串变量。 这是一个例子:

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 将整个文件读入字符串
    $content = file_get_contents($file) or die("ERROR: Cannot open the file.");
        
    // 显示文件内容echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

从文件中读取全部数据的另一种方法是 PHP 的 file() 函数。 它与 file_get_contents() 函数的工作类似,但它以行数组而不是单个字符串的形式返回文件内容。 返回数组的每个元素对应于文件中的一行。

要处理文件数据,您需要使用 foreach 循环对数组进行迭代。 这是一个示例,它将文件读入一个数组,然后使用循环显示它:

<?php
$file = "data.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 将整个文件读入数组
    $arr = file($file) or die("ERROR: Cannot open the file.");
    foreach($arr as $line){
        echo $line;
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

使用 PHP fwrite() 函数编写文件

同样,您可以使用 PHP fwrite() 函数将数据写入文件或附加到现有文件。 该函数的基本语法可以通过以下方式给出:

fwrite(file handle, string)

fwrite() 函数有两个参数 — 文件句柄和要写入的数据字符串,如以下示例所示:

<?php
$file = "note.txt";
    
// 要写入的数据字符串
$data = "The quick brown fox jumps over the lazy dog.";
    
// 打开文件进行写入
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
    
// 将数据写入文件
fwrite($handle, $data) or die ("ERROR: Cannot write the file.");
    
// 关闭文件句柄
fclose($handle);
    
echo "Data written to the file successfully.";
?>

在上面的例子中,如果"note.txt"文件不存在,PHP 会自动创建它并写入数据。 但是,如果"note.txt"文件已经存在,PHP 将在写入新数据之前删除该文件的内容(如果有的话),但是如果您只想附加文件并保留现有内容,只需使用模式 a 而不是上面例子中的 w

另一种方法是使用 file_put_contents() 函数。 它是 file_get_contents() 函数的对应物,提供了一种无需打开文件即可将数据写入文件的简单方法。 此函数接受文件的名称和路径以及要写入文件的数据。 这是一个例子:

<?php
$file = "note.txt";
    
// 要写入的数据字符串
$data = "The quick brown fox jumps over the lazy dog.";
    
// 将数据写入文件
file_put_contents($file, $data) or die("ERROR: Cannot write the file.");
    
echo "Data written to the file successfully.";
?>

如果 file_put_contents() 函数中指定的文件已经存在,PHP 默认会覆盖它。 如果您想保留文件的内容,可以将特殊的 FILE_APPEND 标志作为第三个参数传递给 file_put_contents() 函数。 它只会将新数据附加到文件中,而不是覆盖它。 这是一个例子:

<?php
$file = "note.txt";
    
// 要写入的数据字符串
$data = "The quick brown fox jumps over the lazy dog.";
    
// 将数据写入文件
file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file.");
    
echo "Data written to the file successfully.";
?>

使用 PHP rename() 函数重命名文件

您可以使用 PHP 的 rename() 函数重命名文件或目录,如下所示:

<?php
$file = "file.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 尝试重命名文件
    if(rename($file, "newfile.txt")){
        echo "File renamed successfully.";
    } else{
        echo "ERROR: File cannot be renamed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

使用 PHP unlink() 函数删除文件

您可以使用 PHP 的 unlink() 函数删除文件或目录,如下所示:

<?php
$file = "note.txt";
 
// 检查文件是否存在
if(file_exists($file)){
    // 尝试删除文件
    if(unlink($file)){
        echo "File removed successfully.";
    } else{
        echo "ERROR: File cannot be removed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

在下一章中,我们将了解更多关于 PHP 中的解析目录或文件夹


PHP 文件系统函数

下表提供了一些其他有用的 PHP 文件系统函数的概述,这些函数可用于动态读取和写入文件。

函数 说明
fgetc() 一次读取一个字符。
fgets() 一次读取一行。
fgetcsv() 读取一行逗号分隔的值。
filetype() 返回文件的类型。
feof() 检查是否已到达文件末尾。
is_file() 检查文件是否为普通文件。
is_dir() 检查文件是否为目录。
is_executable() 检查文件是否可执行。
realpath() 返回规范化的绝对路径名。
rmdir() 删除一个空目录。

请查看 PHP 文件系统参考 了解其他有用的 PHP 文件系统函数。

Advertisements