关联课件: 8子项目八 - 图像处理函数(点击在线预览)
8.3.7 文件系统函数
8.3.7.1 文件系统函数概述
在网络编程中要用到的文件操作大致可以分为两大类,一种是普通文件的操作,另一种是数据库文件的操作。在普通文件的操作中对记事本文件的操作最为简单,下面就来探讨一下PHP对文件(以记事本为例)的操作。PHP提供了一些文件操作的函数,常用函数如表6-7所示。
有关详细功能和使用方法请参见PHP 5的帮助文档。
8.3.7.2 文件的打开与读写
要想利用PHP对文件进行操作,就要先了解有关PHP中打开和读写文件的相关函数。
1.fopen()函数
fopen()函数格式如下:
resource fopen (string filename, string mode [, bool use_include_path ])
fopen()函数的作用是打开文件或者URL。其中filename是要打开的文件名,必须为字符串形式。如果filename是“scheme://...”(如https://...)的格式,则被当成一个URL,PHP将搜索协议处理器(也被称为封装协议)来处理此模式。如果PHP认为filename指定的是一个本地文件(如“num.txt”),将尝试在该文件上打开一个流。该文件必须是PHP可以访问的,因此需要确认文件访问权限允许该访问。mode是打开文件的方式,必须为字符形式,可以取以下几个值。
'r':只读形式,文件指针指向文件的开头。
'r ':可读可写,文件指针指向文件的开头。
'w':只写形式,文件指针指向文件的开头,打开同时清除所有内容,如果文件不存在,将尝试建立文件。
'w ':可读可写,文件指针指向文件的开头,打开同时清除所有内容,如果文件不存在,将尝试建立文件。
'a':追加形式(只可写入),文件指针指向文件的最后,如果文件不存在,将尝试建立文件。
'a ':可读可写,文件指针指向文件的最后,如果文件不存在,将尝试建立文件。
2.fgets()函数
fgets()函数的格式如下:
string fgets (int handle [, int length])
fgets()函数的功能是从文件指针中读取一行。其中handle是要读入数据的文件流指针,由fopen函数返回数值。length是要读入的字符个数,实际读入的字符个数是length-1。
从handle指向的文件中读取一行并返回长度最多为length-1字节的字符串。碰到换行符(包括在返回值中)、EOF或者已经读取了length-1字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为1K,也就是说1024字节。出错时返回 FALSE。
3.fwrite()函数
fwrite()函数格式如下:
fwrite()函数的功能是int fwrite (resource handle, string string [, int length])
fwrite()函数的功能是写入文件,与int fputs(resource handle, string str, int [length])功能相同。
fwrite()把string的内容写入文件指针handle处。如果指定了length,当写入了 length 个字节或者写完了 string以后,写入就会停止。
fwrite()返回写入的字符数,出现错误时返回FALSE。
4.fclose()函数
fclose()函数的西格式如下:
bool fclose (resource handle)
fclose()函数的功能是关闭一个已打开的文件指针,即将handle指向的文件关闭。如果成功则返回TRUE,失败则返回FALSE。
文件指针必须有效,并且是通过fopen()或fsockopen()成功打开的。
下面就用以上几个简单的文件操作函数来编写一个文本类型的访客计数器。
1: <!--文件6-25.php:访客计数器-->
2: <html>
3: <head>
4: <title>访客计数器</title>
5: </head>
6: <body>
7: <?php
8: if (!file_exists("num.txt")){ //如果文件不存在
9: $fp=fopen("num.txt", "w"); //借助w参数,创建文件
10: fclose($fp); //关闭文件
11: echo "num.txt文件创建成功!<br>";
12: }
13: $fp=fopen("num.txt","r");
14: @$num=fgets($fp,12); //读取11位数字
15: if ($num=="") $num=0;
16: //如果文件的内容为空,初始化为0
17: $num ; //浏览次数加一
18: @fclose($fp); //关闭文件
19: $fp=fopen("num.txt", "w"); //只写方式打开num.txt文件
20: fwrite($fp,$num); //写入加一后结果
21: fclose($fp); //关闭文件
22: echo "您是第".$num."位浏览者!"; //浏览器输出浏览次数
23: ?>
24: </body>
25: </html>
当程序6-25.php第一次运行时,其运行结果如图6-26(a)所示,第二次运行时,其运行效果如图6-26(b)所示。
(a)第一次运行
(b)第二次运行
不难发现制作一个文件类型计数器的基本思路是:打开一个文件→读出文件里面的内容(数据)→数据 1后再写入该文件→关闭文件。由于当文件以可读可写方式打开时,文件的内容同时被清空,所以做文件计数器时的具体的步骤是:以只读方式打开一个文件→读出文件里面的内容(数据)→关闭文件→再以可读可写方式打开文件→数据 1后再写入该文件→关闭文件。
8.3.7.3 目录的创建、删除与遍历
目录的操作主要是利用相关的目录函数来实现的,先来看一下目录有关的函数。
1)string getcwd (void)
功能:取得当前工作目录。
2)bool chdir (string directory)
功能:将当前目录改为directory。
3)new dir(sting directory)
功能:将输入的目录名转换为一个对象并返回,如:
class dir {
dir(string directory )
string path
resource handle
string read ( void )
void rewind ( void )
void close ( void )
}
该对象含有2个属性和3个方法。2个属性为:
handle:目录句柄。
path:打开目录的路径。
3个方法为:
read (void):读取目录。
rewind (void):复位目录。
close (void):关闭目录。
这3个方法与后面的将要介绍的readdir()、rewinddir()、closedir()函数的作用相同。
4)resource opendir (string path)
功能:打开目录句柄。path为要打开的目录路径.
5)string readdir (resource dir_handle)
功能:返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。
6)dir_handle为目录句柄的resource,之前由opendir()打开。
功能:成功则返回文件名,失败返回FALSE。
7)void rewinddir (resource dir_handle)
功能:倒回目录句柄。将dir_handle指定的目录流重置到目录的开头。dir_handle为目录句柄的resource,之前由opendir()打开。
8)void closedir (resource dir_handle)
功能:关闭目录句柄。关闭由dir_handle指定的目录流。流必须已被opendir()打开。
9)array scandir (string directory [, int sorting_order])
功能:列出指定路径中的文件和目录。返回一个array,包含有directory中的文件和目录。
参数directory是要被浏览的目录。
参数sorting_order是文件的排列顺序,默认的排序顺序是按字母升序排列。如果使用了可选参数 sorting_order(设为1),则排序顺序是按字母降序排列。
10)bool chroot (string directory)
将当前进程的根目录改变为directory。
本函数仅在系统支持且运行于CLI、CGI或嵌入SAPI版本时才能正确工作。此外本函数还需要root权限。
现举例如下:
1: <!--文件6-26.php:目录输出-->
2: <HTML>
3: <HEAD>
4: <TITLE>目录输出</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $dir=getcwd(); //获取当前路径
9: echo getcwd(). "<br>"; //输出当前目录
10: $files1=scandir($dir); //列出指定路径中的文件和目录
11: $files2=scandir($dir,1);
12: print_r($files1); //输出指定路径中的文件和目录
13: print_r($files2);
14: $dir=dir($dir);
15: echo gettype($dir)."<br>";
16: echo "目录句柄:".$dir->handle."<br>";
17: echo "目录路径:".$dir->path."<br>";
18: while ($entry=$dir->read())
19: echo $entry.";<br> ";
20: $dir->close();
21: if (chdir("c:/windows")){
22: echo "当前目录更改成功:c:/windows<br>";
23: }else{
24: echo "当前目录更改失败!<br>";
25: }
26: ?>
27: </BODY>
28: </HTML>
程序6-26.php运行结果如图6-27所示。
图6-27 程序6-26.php的运行结果
下面再来看一个例子,具体体会一下目录操作在实际中的应用。
1: <!--文件6-27.php:遍历图片显示-->
2: <HTML>
3: <HEAD>
4: <TITLE>遍历图片显示</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $addr="./image/";
9: $dir=dir($addr);
10: while ($file_name=$dir->read()){
11: if ($file_name=="." or $file_name==".."){
12: }else{
13: echo "<img src=".$addr.$file_name." width=40 height=
30>&n bsp; ";
14: }
15: }
16: ?>
17: </BODY>
18: </HTML>
其运行结果如图6-28所示。
图6-28 程序6-27.php的运行结果
fopen()函数的作用是打开文件或者URL。其中filename是要打开的文件名,必须为字符串形式。如果filename是“scheme://...”(如http://...)的格式,则被当成一个URL,PHP将搜索协议处理器(也被称为封装协议)来处理此模式。如果PHP认为filename指定的是一个本地文件(如“num.txt”),将尝试在该文件上打开一个流。该文件必须是PHP可以访问的,因此需要确认文件访问权限允许该访问。mode是打开文件的方式,必须为字符形式,可以取以下几个值。 'r':只读形式,文件指针指向文件的开头。 'r ':可读可写,文件指针指向文件的开头。 'w':只写形式,文件指针指向文件的开头,打开同时清除所有内容,如果文件不存在,将尝试建立文件。 'w ':可读可写,文件指针指向文件的开头,打开同时清除所有内容,如果文件不存在,将尝试建立文件。 'a':追加形式(只可写入),文件指针指向文件的最后,如果文件不存在,将尝试建立文件。 'a ':可读可写,文件指针指向文件的最后,如果文件不存在,将尝试建立文件。
通过这节课的学习,我明白了fclose()函数的功能是j关闭一个已打开的文件指针,即将handle指向的文件关闭。如果成功则返回TRUE,失败则返回FALSE。
更加清晰明了