php支持对文件的打开、关闭、读取和写入操作。
1. 打开/关闭文件
在处理文件内容之前,通常需要创建所谓的句柄。同样,结束该文件的操作之后,应当销毁该句柄。
将数据写入一个文件,一般有3个步骤:
(1)打开文件。如果文件不存在,则需要先创建它;
(2)将数据写入文件;
(3)关闭文件。
同样,从一个文件读取数据,也有3个步骤:
(1)打开文件。如果文件不能打开(例如文件不存在或没有读取该文件的权限等),就应该意识到这一点并且正确的退出;
(2)从文件中读取数据;
(3)关闭文件。
1.1 打开文件
在php中,可以使用fopen()函数来打开文件,这个文件既可以是本地文件,也可以是网络上的文件,它支持相对路径和绝对路径。
$file = fopen("/file/text.txt", "r");
$file = fopen("http://www.demo.com/text.txt", "a");
调用fopen()的时候一般需要传递2-4个参数。通常情况下使用2个参数,正如以上代码所示。
(1)第一个参数为要打开文件的URL;
(2)第二个参数为文件的模式。文件模式可以告诉操作系统如何处理来自其他人或脚本的访问请求,以及一种用来检查你是否有权访问这个特定文件方法。在打开文件时有以下3种选择:
打开一个文件为了只读、只写或是读写;
如果要写一个文件,则可以覆盖所有已有的文件内容,或者将新数据追加到文件末尾;
如果在一个区分二进制文件和纯文本文件的系统上写一个文件,还必须指定其采用的方式。
(3)第三个参数为可选参数,如果资源位于本地文件系统,php则认为可以使用本地路径或相对路径来访问此资源。
(4)第四个参数也为可选参数,fopen()函数允许文件的名称以协议名开始,并且在一个远程位置打开该文件。通过设置这个参数,还可以支持一些其他协议。
1.2 关闭文件
在php中可以使用fclose()函数来关闭文件。如果成功,则返回true,否则返回false。
$file = fopen("text.txt", "w");
// do...
fclose($file);
2. 读取文件
2.1 fread()和file()函数
php读取文件时可以使用fread()函数,语法格式如下:
string fread(int $handle, int $length);
其中$handle是通过fopen()得到的数据源,打开某文件后,对这个文件的操作都可以通过这个数据源来实现。fread()的第二个参数是指定文件要读取的长度,可以通过filesize()函数来得到文件的总长度。
接下来看一个更有效的函数file(),该函数返回一个数组,数组中的每个元素就是文件的一行,各元素由换行符分隔,同时换行符仍附加在每个元素的末尾。示例代码如下:
$file = file("text.txt");
2.2 fpassthru()函数
fpassthru()函数可以通过fopen()打开的文件指针作为参数,来将文件中的信息标准输出到浏览器中,并在输出后关闭,代码如下:
$file = fopen("text.txt", "r");
fpassthru($file);
如果读取操作成功,fpassthru()函数将返回true,否则返回false。
2.3 fgets()和fgetss()函数
fgets()函数可以读取指定文档中的一行,如果读取文件成功则返回读取的字符串,否则返回false。示例如下:
$order = fgets($file, 100);
fgetss()函数与fgets()函数的不同之处在于,fgetss()函数可以过滤字符串中包含的php和html标记,语法结构如下:
string fgetss(resource file, int length, string[allowable_tags]);
如果设置可选参数allowable_tags的值,那么该值在待处理字符串中将不被过滤。
2.4 fgetcsv()函数
如果文件中存在一些定界符,而我们想根据定界符来分开文件中的文件信息,则可以使用fgetcsv()方法,该方法将返回一个数组。语法形式如下:
array fgetcsv(resource handle[, int length[, string delimiter[, string enclosure]]])
遇到换行时读取操作将不会停止,而会在读取了length个字符后停止。对于php5来说,如果省略length或将其设置为0,呢么长度没有限制,不过可能会影响执行效率。因为这会降低性能,所以应该选择一个较大的数值,保证它肯定能超过文件中最常一行的长度。可选参数delimiter(默认设为逗号)标识用于界定每个字段的字符。可选参数enclosure(默认设为双引号)标识用来设置字段环绕符(只允许一个字符)。使用此参数可以在不同的上下文中对delimiter参数中所包含的值进行匹配解析。
3. 写入文件
当写入文件时,要使用w(write)或a(append)之类的模式来打开文件。
fwrite()函数用来帮助向文件写入一行字符串。语法格式如下:
int fwrite(resource handle, string string[, int length])
fwrite()函数接受两个参数:第一个参数是需要写入的文件资源,第二个参数是要写入的字符串:
$file = fopen("text.txt", "w");
$str = "Hello world!";
fwrite($file, $str);
fclose($file);
4. 方便的文件处理函数
为了方便文件操作,php5提供了file_get_contents()和file_put_contents()函数。这两个函数继承了在文件操作流程上所需要的整套函数。这些工作包含打开和关闭文件。
file_get_contents()函数的功能实现与file()函数类似,不同的是file()函数读取文件后返回一个数组,而file_get_contents()函数则返回一个存储文件所有内容的字符串。如果要使用file()函数返回的内容,则要使用implode('', $file)来连接所有数组中的值才能达到file_get_contents()函数的效果。
而file_put_contents()则是最方便好用的写入文件函数,它需要传入两个参数,第一个参数为目标文件名,第二个参数为需要写入的内容。当我们想以追加的方式写入文件时,需要传入第三个参数并取值为FILE_APPEND。
5. 其他文件处理函数
bool copy(string source, string dest):将文件source复制给dest。
string dirname(string path):其中,path为指向一个文件的全路径的字符串,返回该文件的目录。
bool feof(resource handle):如果文件指针指向EOF(End Of File)或出错,则返回true,如果socket超时则返回一个错误,其他情况返回false。
bool file_exiets(string filename):如果存在由filename指定的文件或目录,则返回true,否则返回false。
int file_size(string filename):返回文件大小的字节数,如果出错,则返回false。
6. fopen()函数第二个参数常用打开方式说明
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
打开方式 说明
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
r 指针指向文件的开头,以只读方式打开文件
r+ 指针指向文件的开头,以读写方式打开文件,写入数据从头覆盖原数据
w 以写入方式操作文件,写入的数据将覆盖文件原先的数据
w+ 与w的功能基本相同,增加了读取功能
a 指针指向文件末尾,以可写方式打开文件,写入数据会追加到原先文件的末尾
a+ 与a的基本功能相同,增加了读取功能
x 如果目标文件存在,则返回警告;如果不存在,则创建该文件
x+ 与x的基本功能相同,增加了读取功能
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:如果目标文件不存在,w+将会自动创建,而r+将会报错。