PHP 文件系统
在本教程中,您将学习如何使用 PHP 的文件系统函数动态创建、访问(或读取)和操作文件。
在 PHP 中处理文件
由于 PHP 是一种服务器端编程语言,它允许您使用存储在 Web 服务器上的文件和目录。 在本教程中,您将学习如何使用 PHP 文件系统函数在 Web 服务器上创建、访问和操作文件。
使用 PHP fopen()
函数打开文件
要使用文件,您首先需要打开文件。 PHP fopen()
函数用于打开文件。 该函数的基本语法可以通过以下方式给出:
传递给 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()
函数可用于从文件中读取指定数量的字符。 可以给出这个函数的基本语法。
这个函数有两个参数 — 文件句柄和要读取的字节数。 以下示例从"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.";
}
?>
上面的例子会产生如下输出:
读取文件的全部内容
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.";
}
?>
上面的例子会产生如下输出:
在 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.";
}
?>
上面的例子会产生如下输出:
另一种无需打开文件即可读取文件全部内容的方法是使用 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()
函数有两个参数 — 文件句柄和要写入的数据字符串,如以下示例所示:
<?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 文件系统函数。