PHP 文件系统

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

在 PHP 中使用文件

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

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

要使用文件,首先需要打开文件。PHP fopen() 函数用于打开文件。该函数的基本语法如下:

fopen(filename , mode) 

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

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

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

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

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

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to open the file
    $handle = fopen($file, "r");
} else{
    echo "ERROR: File does not exist.";
}
?>

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

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

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

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    /* Some code to be executed */
        
    // Closing the file handle
    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";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // Read fixed number of bytes from the file
    $content = fread($handle, "20");
        
    // Closing the file handle
    fclose($handle);
        
    // Display the file content 
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子将产生以下输出:

The quick brown fox jumps over the lazy dog.

读取文件的全部内容

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

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // Reading the entire file
    $content = fread($handle, filesize($file));
        
    // Closing the file handle
    fclose($handle);
        
    // Display the file content
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子将产生以下输出:

The quick brown fox jumps over the lazy dog.

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

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Reads and outputs the entire 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";
 
// Check the existence of file
if(file_exists($file)){
    // Reading the entire file into a string
    $content = file_get_contents($file) or die("ERROR: Cannot open the file.");
        
    // Display the file content 
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

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

要处理文件数据,你需要使用 foreach 循环 遍历数组。这是一个示例,它将文件读入数组,然后使用循环显示它:

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Reading the entire file into an array
    $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() 函数有两个参数 - file handle 和要写入的数据字符串 string,如以下示例所示:

<?php
$file = "note.txt";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Open the file for writing
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
    
// Write data to the file
fwrite($handle, $data) or die ("ERROR: Cannot write the file.");
    
// Closing the file handle
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";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Write data to the file
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";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Write data to the file
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";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to rename the 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
$file = "note.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to delete the 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() 删除一个空目录。