13.1 文件处理

13.1 文件处理

视频讲解:光盘TMlx13文件处理.exe

文件处理包括读取、关闭、重写等,掌握文件的处理需要读者理清思路,掌握文件处理的关键步骤和常用函数,完全可以运用自如。

例如,访问一个文件需要3步:打开文件、读写文件和关闭文件。其他的操作要么是包含在读写文件中(如显示内容、写入内容等),要么与文件自身的属性有关系(如文件遍历、文件改名等)。本节将对常用的文件处理技术进行详细讲解。

13.1.1 打开/关闭文件

打开/关闭文件使用fopen()函数和fclose()函数。打开文件应格外认真,一不小心就有可能将文件内容全部删掉。

1.打开文件

对文件进行操作时首先要打开文件,这是进行数据存取的第一步。在PHP中使用fopen()函数打开文件,fopen()函数的语法如下:

resource fopen (string filename, string mode [, bool use_include_path]);

其中,filename是要打开的包含路径的文件名,可以是相对路径,也可以是绝对路径,如果没有任何前缀则表示打开的是本地文件;mode是打开文件的方式,可取的值如表13.1所示;use_include_path是可选的,该参数在配置文件php.ini中指定一个路径,如E:wamp wwwmess.php,如果希望服务器在这个路径下打开所指定的文件,可以设置为1或true。

表13.1 fopen()中参数mode的取值列表

2.关闭文件

对文件的操作结束后应该关闭这个文件,否则可能引起错误。在PHP中使用fclose()函数关闭文件,该函数的语法如下:

bool fclose(resource handle);

该函数将参数handle指向的文件关闭,如果成功,返回true,否则返回false。其中的文件指针必须是有效的,并且是通过fopen()函数成功打开的文件。例如:

<?php $f_open=fopen("../file.txt.", "rb"); //打开文件 … //对文件进行操作 fclose($f_open) //操作完成后关闭文件 ?>

13.1.2 读写文件

相对打开和关闭文件来说,读写文件更复杂一些。这里主要从读取数据和写入数据两方面讲解。

1.从文件中读取数据

从文件中读取数据,可以读取一个字符、一行字串或整个文件,还可以读取任意长度的字串。

1)读取整个文件:readfile()、file()和file_get_contents()

(1)readfile()函数

readfile()函数用于读入一个文件并将其写入到输出缓冲,如果出现错误则返回false。函数语法如下:

int readfile(string filename)

使用readfile()函数,不需要打开/关闭文件,不需要echo/print等输出语句,直接写出文件路径即可。

(2)file()函数

file()函数也可以读取整个文件的内容,只是file()函数将文件内容按行存放到数组中,包括换行符在内,如果失败则返回false。函数语法如下:

array file(string filename)

(3)file_get_contents()函数

该函数将文件内容(filename)读入一个字符串。如果有offset和maxlen参数,将在参数offset所指定的位置开始读取长度为maxlen的内容。如果失败,返回false。函数语法如下:

string file_get_contents(string filename[, int offset[, int maxlen]])

该函数适用于二进制对象,是将整个文件的内容读入到一个字符串中的首选方式。

【例13.1】本例使用readfile()函数、file()函数和file_get_contents()函数分别读取文件tm.txt的内容,实例代码如下:(实例位置:光盘TMsl131)

<table width="500" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="253" height="100" align="right" valign="middle" scope="col">使用readfile()函数读取文件内容: </td> <td width="241" height="100" align="center" valign="middle" scope="col"> <! -- 使用readfile()函数读取tm.txt文件的内容 --> <?php readfile('tm.txt'); ?> </td> <! -- -------------------------------------------------------- --> </tr> <tr> <td height="100" align="right" valign="middle">使用file()函数读取文件内容:</td> <td height="100" align="center" valign="middle"> <! -- 使用file()函数读取tm.txt文件的内容 --> <?php $f_arr = file('tm.txt'); foreach($f_arr as $cont){ echo $cont."<br>"; } ?></td> <! -- -------------------------------------------------- --> </tr> <tr> <td width="250" height="25" align="right" valign="middle" scope="col">使用file_get_contents()函数读取文 件内容:</td> <td height="25" align="center" valign="middle" scope="col"> <! -- 使用file get contents()函数读取tm.txt文件的内容 --> <?php $f_chr = file_get_contents('tm.txt'); echo $f_chr; ?></td> <! -- ------------------------------------------------------------------- --> </tr> </table>

运行结果如图13.1所示。

图13.1 读取整个文件

2)读取一行数据:fgets()和fgetss()

(1)fgets()函数

fgets()函数用于一次读取一行数据。函数语法如下:

string fgets( int handle [, int length] )

其中,handle是被打开的文件,length是要读取的数据长度。函数能够实现从handle指定文件中读取一行并返回长度最大值为length-1个字节的字符串。在遇到换行符、EOF或者读取了length-1个字节后停止。如果忽略length参数,那么读取数据直到行结束。

(2)fgetss()函数

fgetss()函数是fgets()函数的变体,用于读取一行数据,同时,fgetss()函数会过滤掉被读取内容中的HTML和PHP标记。函数语法如下:

string fgetss ( resource handle [, int length [, string allowable_tags]] )

该函数能够从读取的文件中过滤掉任何HTML和PHP标记。可以使用allowable_tags参数来控制哪些标记不被过滤掉。

【例13.2】使用fgets()函数与fgetss()函数分别读取fun.php文件并显示出来,观察它们有什么区别。实例代码如下:(实例位置:光盘TMsl132)

<table border="1" cellspacing="0" cellpadding="0"> <tr> <td align="right" valign="middle" scope="col">使用fgets函数:</td> <td align="center" valign="middle" scope="col"> <! -- 使用fgets函数读取.php文件 --> <?php $fopen = fopen('fun.php', 'rb'); while(! feof($fopen)){ //feof()函数测试指针是否到了文件结束的位置 echo fgets($fopen); //输出当前行 } fclose($fopen); ?> <! -- ----------------------------------------- --> </td> </tr> <tr> <td align="right" valign="middle">使用fgetss函数:</td> <td align="center" valign="middle"> <! -- 使用fgetss函数读取.php文件 --> <?php $fopen = fopen('fun.php', 'rb'); while(! feof($fopen)){ //使用feof()函数测试指针是否到了文件结束的位置 echo fgetss($fopen); //输出当前行 } fclose($fopen); ?> </td> </tr> </table>

运行结果如图13.2所示。

图13.2 fgets()函数和fgetss()函数的区别

3)读取一个字符:fgetc()

在对某一个字符进行查找、替换时,需要有针对性地对某个字符进行读取,在PHP中可以使用fgetc()函数实现此功能。函数语法如下:

string fgetc ( resource handle )

该函数返回一个字符,该字符从handle指向的文件中得到。遇到EOF则返回false。

【例13.3】在本例中,使用fgetc()函数逐个字符读取文件03.txt的内容并输出。实例代码如下:(实例位置:光盘TMsl133)

<pre> <?php $fopen=fopen('03.txt', 'rb'); //创建文件资源 while(false! ==($chr=fgetc($fopen))){ //使用fgetc()函数取得一个字符,判断是否为false echo$chr; //如果不是,输出该字符 } fclose($fopen); //关闭文件资源 ?> </pre>

运行结果如图13.3所示。

图13.3 使用fgetc()函数读取字符

4)读取任意长度的字串:fread()

fread()可以从文件中读取指定长度的数据,函数语法如下:

string fread ( int handle, int length )

其中,handle为指向的文件资源,length是要读取的字节数。当函数读取length个字节或到达EOF时停止执行。

【例13.4】使用fread()函数读取文件04.txt的内容。实例代码如下:(实例位置:光盘TMsl134)

<?php $filename="04.txt"; //要读取的文件 $fp=fopen($filename, "rb"); //打开文件 echo fread($fp,32); //使用fread()函数读取文件内容的前32个字节 echo "<p>"; echo fread($fp, filesize($filename)); //输出其余的文件内容 ?>

运行结果如图13.4所示。

图13.4 使用fread()函数读取文件

2.将数据写入文件

写入数据也是PHP中常用的文件操作,在PHP中使用fwrite()和file_put_contents()函数向文件中写入数据。fwrite()函数也称为fputs(),它们的用法相同。fwrite()函数的语法如下:

int fwrite ( resource handle, string string [, int length] )

该函数把内容string写入文件指针handle处。如果指定了长度length,则写入length个字节后停止。如果文件内容长度小于length,则会输出全部文件内容。

file_put_contents()函数是PHP 5新增的函数,其语法为:

int file_put_contents ( string filename, string data [, int flags])

filename为写入数据的文件。

data为要写入的数据。

flags可以是FILE_USE_INCLUDE_PATH、FILE_APPEND或LOCK_EX, LOCK_EX为独占锁定,在13.3.3节锁定文件中将会介绍。

使用file_put_contents()函数和依次调用fopen()、fwrite()、fclose()函数的功能一样。下面通过实例比较一下该函数的优越性。

【例13.5】本例首先使用fwrite()函数向05.txt文件写入数据,再使用file_put_contents()函数写入数据。实例代码如下:(实例位置:光盘TMsl135)

<?php $filepath = "05.txt"; $str="此情可待成追忆 只是当时已惘然<br>"; echo "用fwrite函数写入文件:"; $fopen = fopen($filepath, 'wb') or die(’文件不存在’); fwrite($fopen, $str); fclose($fopen); readfile($filepath); echo "<p>用file_put_contents函数写入文件:"; file_put_contents($filepath, $str); readfile($filepath); ?>

运行结果如图13.5所示。

图13.5 使用fwrite()和file_put_contents()函数写入数据

13.1.3 操作文件

除了可以对文件内容进行读写,对文件本身同样也可以进行操作,如复制、重命名、查看修改日期等。PHP内置了大量的文件操作函数,常用的文件函数如表13.2所示。

表13.2 常用的文件操作函数

说明

在读写文件时,除了file()、readfile()等少数几个函数外,其他操作必须要先使用fopen()函数打开文件,最后用fclose()函数关闭文件。文件的信息函数(如filesize、filemtime等)则都不需要打开文件,只要文件存在即可。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

13.1 文件处理