文件处理
将数据写入一个文件,有3个步骤:
1. 打开文件
2. 将数据写入这个文件
3. 关闭这个文件
同样,从一个文件中读取数据,也有3个步骤
1. 打开文件。如果文件打不开,就应正确地退出
2. 从文件中读取数据
3. 关闭这个文件
1. 打开文件
要在PHP中打开一个文件,可以使用fopen()函数。当打开文件的时候还要指定打开模式。
1.1 选择文件模式
模式 | 模式名称 | 意义 |
---|---|---|
r | 只读 | 读模式–打开文件,从文件头开始读 |
r+ | 只读 | 读写模式–打开文件,从文件头开始读写 |
w | 只写 | 写模式–打开文件,从文件头开始读。如果该文件已存在,将删除所有文件已有内容。如果文件不存在,将创建这个文件 |
w+ | 只写 | 写模式–打开文件,从文件头开始读写。如果该文件已存在,将删除所有文件已有内容。如果文件不存在,将创建这个文件 |
x | 谨慎写 | 写模式打开文件,从文件头开始写。如果文件已经存在,该文件将不会被打开,fopen()函数将返回false,同时PHP将产生一个警告 |
x+ | 谨慎写 | 读写模式打开文件,从文件头开始写。如果文件已经存在,该文件将不会被打开,fopen()函数将返回false,同时PHP将产生一个警告 |
a | 追加 | 追加模式–打开文件,如果文件已经有内容,将从文件末尾开始追加(写)。如果文件不存在,将创建这个文件 |
a+ | 追加 | 追加模式–打开文件,如果文件已经有内容,将从文件末尾开始追加(写)或者读。如果文件不存在,将创建这个文件 |
1.2 打开文件
可以使用fopen()打开文件,如果fopen()函数调用失败,将会返回false。可以以一种友好的方式来处理这个错误,通过抑制PHP的错误信息并根据自己的方式给出错误信息。(当然也可以使用抛出异常的方式)
@ $fp = fopen("filename.fileformate", "mode");
if (!$fp) {
echo "<p>文件打开失败!</p>";
exit; //程序到这就终止了
}
2. 写文件
在PHP中写入文件可以使用fwrite()函数。调用方式如下:
fwrite($fp, $outputstring);
这个函数告诉PHP将$outputstring中的字符串写入到$fp所指的文件中去。
3. 关闭文件
当使用完文件后,应将其关闭,关闭方法如下:
fclose($fp);
一般不出错,成功就返回true。
4. 读文件
4.1 以只读方式打开文件
$fp = fopen("filename.fileformat", 'r');
4.2 知道何时读完文件:feof()
函数feof()的唯一参数是文件指针。如果文件指针指向了末尾,便返回true。feof是File End Of File的缩写。
我们就可以使用如下的循环来读取文件:
while (!feof($fp)) {
# code here
}
4.3 每次读取一行数据
- 举个例子:
fgets($fp, 999);
上述代码会从文件中每次读取一行数据,直至读到一个换行字符(\n)、或者文件结束符EOF,或者是从文件中读取了998B。(注意:大小是999-1)
- 也可以使用函数fgetss(),其函数原型如下:
string fgetss(resource fp, int length stirng [allowable_tags]);
fgetss()函数可以过滤字符串中包含的HTML标记和PHP。如果要过滤任何特殊的标记,可以将它们包含在allowable_tags数组中。
4.4 读取整个文件
用法如下:
readfile("filename.fileformat");
4.5 读取任意长度
使用fread()读取任意长度的字节,该函数原型如下:
string fread(resource fp, int length);
5. 其他有用的函数
5.1 文件是否存在
如果希望在不打开文件的情况下,检查一个文件是否存在,可以使用file_exists()。
if (file_exists("filename.fileformat")) {
echo "文件存在!";
}
else {
echo "不存在!";
}
5.2 文件大小
可以使用函数filesize()函数来查看一个文件的大小。
echo filesize("filename.fileformat");
5.3 删除一个文件
使用unlink()函数来删除一个文件。(PHP中没有名为delete的函数)
unlink("filename.fileformat");
5.4 在文件中定位:rewind()、fseek()和ftell()
rewind()函数可以将文件指针复位到文件的开始。ftell()函数可以以字节为单位报告指针当前在文件中的位置。
可以使用fseek()函数将文件指针指向文件的某个位置。其函数原型如下:
int fseek(resource fp, int offset [, int whence])
调用fseek()函数可以将文件指针从whence处移动offset个字节。whence是一个可选值,缺省值SEEK_SET表示文件的开始处,SEEK_CUR表示文件指针的当前位置,SEEK_END表示文件的结束位置。
示例程序:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>写入数据</title>
<style>
form
{
width: 400px;
height: 400px;
margin-left: 100px;
padding: 10px;
border: 1px solid #ccc;
}
input
{
width: 100px;
height: 20px;
}
</style>
</head>
<body>
<form action="fwrite.php" method="post">
时间:<input type="date" name="dateTime" ><br>
<br>
内容:<textarea name="content" cols="30" rows="10"></textarea><br>
<br>
<input type="submit" value="发送">
</form>
</body>
</html>
处理脚本:
<?php
$dateTime = $_POST['dateTime'];
$content = $_POST['content'];
if (isset($dateTime) && isset($content)) {
$outputstring = $dateTime."\t".$content."\n";
@ $fp = fopen('data.txt', 'a');
if (!$fp) {
echo "<p>文件无法打开也无法创建!</p>";
exit;
}
fwrite($fp, $outputstring);
fclose($fp);
}
echo "<p>文件写入成功,现在data.txt的内容为:</p><br>";
@ $fp = fopen('data.txt', 'r');
while (!feof($fp)) {
$data = fgets($fp, 100);
echo $data."<br>";
}
fclose($fp);
?>
运行示例: