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 的 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() |
删除一个空目录。 |