PHP文件处理函数归纳
一.打开和关闭文件
PHP大部分对文件的操作都需要先打开文件,当然文件操作完成以后再关闭文件,其中打开文件使用fopen()函数,语法如下:
resource fopen(string filename , string mode [ ,bool use_include_path]);
fopen() 函数共有三个参数,第一个参数filename是路径和文件名,可以是相对路径也可以是绝对路径;第二个参数mode是文件的打开方式,其取值如下:
mode取值 | 模式名称 | 说明 |
r | 只读 | 只能读文件,文件指针初始位置在文件的开头;如果文件不存在会报warning,且不会创建新文件 |
r+ | 读写 | 可读可写,文件指针初始值在文件的开头;使用r+模式打开不会先清空内容,如果写入数据, 会挨个字符覆盖原来的内容;如果文件不存在会报warning,且不会创建新文件 |
w | 只写 | 只能写入,先清空文件内容,然后文件指针初始位置在开头,全部重新写; 如果文件不存在,会自动创建这个文件 |
w+ | 读写 | 可读可写,同w一样打开文件即清空,文件指针在开头,如果文件不存在会自动创建 |
x | 谨慎写 | 只能写入,且文件不应该存在,打开后自动创建,如果存在的话文件不会被打开,并报warning |
a | 追加 | 只写,文件指针在文件末尾,往后继续写(不论文件指针在哪);如果文件不存在则自动创建 |
a+ | 追加 | 可读可写,写的规则同a |
b | 二进制 | 二进制模式,window可以区分二进制文件和文本文件,推荐使用 |
t | 文本 | 文本模式 |
而第三个参数use_include_path是可选的,当为1或true时,会打开php.ini中指定路径的文件。
另外,fopen() 函数的返回值是一个文件指针,这个文件指针指向文件中的某个位置,可以通过fseek()移动其位置,文件指针也是很多其他文件操作函数的参数,例如fclose() ,fgets(), fgetc(), fread(), fwrite() 这些函数,都需要先用fopen()取得文件指针才能使用。
PHP关闭文件是通过fclose() 函数实现的,语法如下:
bool fclose(resource handle);handle为文件指针,由fopen() 函数得到,fcolse() 成功返回true,失败返回false。
eg:
<?php $fopen=fopen("file.txt","rb"); //打开文件 ...... //文件操作 fclose($fopen); //关闭文件 ?>
二.读写文件内容
1)读全部文件内容:不需要先打开文件,参数为路径和文件名
1. readfile() 函数用于直接输出文件内容,不需要打开文件,其参数为路径与文件名,也不需要echo,其中换行变为空格输出,如出现错误返回false,语法如下:
int readfile(string filename);
2. file() 函数把文件内容的每一行分别存放入一个数组中,返回值即为这个数组,全空的一行也会成一个空的元素,有几行就有几个元素,也不用先打开文件,语法如下:
array file(string filename);eg:
<?php $farr=file("file.txt"); foreach($farr as $cont){ echo $cont."<br>"; } ?>
string file_get_contents(string filename);
2)读部分文件内容:要先打开文件得到文件指针,作为函数的参数,读完后指针自动向后移动,读取后文件指针永远指向读取的最后一个字符
1. fgets() 函数可以用于读一行的内容,返回值是字符串,需要用echo输出。其两个参数分别为文件指针和要读取的数据长度,实际返回的是:从指针开始(指针可能在中间,指针前的部分不输出),数据长度length -1个字节的字符串,如length为 3 则返回 2 个字节的字符(数字英文一个字节,中文两个字节,空格一个字节,回车两个字节),如果没有设置length参数,则默认把整行都读完。语法如下:
string fgets(resource handle,[ int lenght] );
2.fgetss() 与 fgets() 唯一的不同是前者会忽略掉脚本标记,如一些字体格式脚本,用fgetss()这些格式将不会被显示出来。
3.fgetc()函数用于读单个字符,即返回指针所指的那个字符,读后制作自动后移,遇EOF(指针在文件结束位置)则返回false,语法如下:
string fgetc(resource handle);
eg:
<?php $fopen=fopen("file.txt","rb"); while(false!=($chr=fgetc($fopen))){ echo $chr; } fclose($fopen); ?>
4.fread()函数用于读指定长度的数据,与fgets()不同的是:fread()返回的是length个字节,而fgets()返回的是length-1个字符,语法如下:
string fread(resource handle,int length);
1.fwrite() 函数用于写入内容,其返回值为实际写入的字节数,三个参数分别为文件指针,需写入内容,写入的最大长度,从文件指针所指位置开始往后写,一直到写入了length后停止,如果没有设置length或写入内容字节数小于length,则全部写入,文件原来相应位置有内容则将其覆盖。
需要特别注意的是文件的打开方式,用w或w+打开则会先清空原文件文件指针在开头;用r+ 打开不会清空文件且文件指针在文件开头,写入的内容覆盖原来的内容;用a 或a+ 打开不会清空文件且文件指针在末尾,写入内容追加在原来内容之后,也只有用a打开写入不影响原来的内容。
语法如下:
int fwrite(resource handle, string data, [int length]);
2.file_put_contents() 函数相当于一次完成了fopen(), fwrite(), fclose() 三个操作,参数只要写文件地址即可,不需要文件指针,简化了代码,但是不能设置最大写入长度length,并且默认文件打开方式为w,会清空原文件内容,语法如下:
int file_put_contents(string filename, string data);
3)修改文件指针位置(需要先打开文件获得文件指针)
1.rewind() 函数将文件指针设置为文件的开头。语法如下:
bool rewind(resource handle);
2.fseek() 用于移动文件指针,非常重要。函数成功返回 0,否则返回 -1。函数的三个参数分别为handle,offset,whence。其中handle为文件指针;offest以字节为单位,为指针的绝对位置或者相对whence参数的偏移量,这样要根据第三个参数决定;whence的值包括以下三种,必须大写:
SEEK_SET,绝对定位,offset的值即时指针的位置,如当offset为0时,文件指针在第一个字节上;当offset为1时,文件指针在第二个字节上。值得注意的是一个中文是包括两个字节的,如果指针指向一个中文的第二个字节时,读出时会读出乱码。
SEEK_CUR,相对定位,相对于指针当前的位置前后移动,此时offset为一个偏移量,可正可负,正数表示往后移动,负数表示往前移动。
SEEK_END,相对定位,相对于文件尾(有内容的最后一个字节再往后一个字节,为空)前后移动,此时offset同样为一个偏移量,当offset为-1时指针指向的是最后一个字节。
另外,如果文件指针设置到开头以前,则看作指向开头,如果超过设置到文件尾以后,看作指向文件尾,读出的是一个空值。
如果不设置whence,则默认为SEEK_SET方式。
int fseek(resource handle, int offset, [whence]);
3.feof() 函数用于判断指针是否在文件末尾。语法如下:
bool feof(resource handle);
4.ftell() 函数用于返回当前指针的位置,单位为字节,相当于返回SEEK_SET模式下的offset值。语法如下:
int ftell(resource handle);
5.只要是读文件内容的函数,都自带移动文件指针的功能。
三.对文件自身的修改(不需要打开文件)
1.copy() 函数用于将文件从路径一复制到路径二,路径要写在引号内,包括文件名和扩展名。函数成功返回true,失败返回false,成功的话用echo输出为1。语法如下:
bool copy(string path1, string path2);
2.rename() 函数用于重命名文件,实际上两个参数依旧是两个路径,将文件以新名字从旧路径复制到新路径,再删除旧路径的文件,若再同一个目录中则直接重命名。语法如下:
bool rename(string path1, string path2);
3.unlink() 函数用于删除文件。语法如下:
bool unlink(string path);
4.fileatime() 函数用于返回文件最后一次被访问时间,以UNIX时间戳的形式返回。语法语法如下:
int fileatime(string path);
5.filemtime() 函数用于返回最后一次被修改的时间,也是以UNIX时间戳形式返回。语法如下:
int filemtime(string path);
6.filesize() 函数用于获取文件内容的字节数,字母数字一个字节,中文两个字节,空格一个字节,回车两个字节。语法如下:
int filesize(string path);
7.realpath() 函数用于返回文件的绝对路径。语法如下:
string realpath(string path);
8.pathinfo() 函数用用于返回一个数组,其中包含文件的路径信息,如相对路径(如果在当前目录中返回 "." ),全名,扩展名,文件名等等。语法如下:
array pathinfo(string path);eg:
$arr=pathinfo("file.txt"); foreach($arr as $method=>$value){ echo $method.":".$value."<br>"; }
9.stat() 函数用于返回一个数组,包括文件大小,最后修改时间等相关信息。语法如下
array stat(string path);
四.上传文件
1.要上传文件先要写上传文件域,要写一个form,from里一定要写enctrype="multipart/form-data",然后在form内部写一个type="file"的input和一个提交按钮。
2.预定义变量$_FILES储存了上传文件的相关信息,十分重要。$_FILES是一个二维数组,外层只有一个元素filename,是type="file"的input中设定的name;内层有5个元素,包含了上传文件的信息,具体如下:
$_FILES[filename][name] 存储的是上传文件的文件名,包括扩展名
$_FILES[filename][size] 存储的是文件大小,单位为字节
$_FILES[filename][tmp_name] 文件上传是会先保存在一个临时文件目录中成为一个临时文件,tmp_name即为这个临时文件名
$_FILES[filename][type] 上传文件的类型
$_FILES[filename][error] 上传文件的结果,0表示上传成功
3.文件会先保存为一个临时文件,当脚本结束式系统将自动删除这个临时文件,所以我们需要move_uploaded_file() 函数来将这个临时文件移动到我们希望的位置,函数的两个参数一个是临时文件名,即为$_FILES["tmp_name"],另一个我们希望保存到的新路径和文件名,文件名一般为$_FILES["name"]。语法如下:
bool move_uploaded_file(string filename, string destination);eg:
<?php if(!empty($_FILES["upfile"]["name"])){ $fileinfo = $_FILES["upfile"]; move_uploaded_file($fileinfo["tmp_name"],$fileinfo["name"]); } ?> <form action="" method="post" enctype="multipart/form-data" name="form"> <input name="upfile" type="file" ></input> <input type="submit" name="submit" value="上传"></input> </form>
这里的第二个参数使用相对位置保存在同一个目录中,如果想保存在其他目录中,可以"……/……/ ".$fileinfo["name"] 这样写;如果想保存在前几级的目录中,两点即为返回上一级目录,如"../ ".$fileinfo["name"] 即为返回上一级,"../../ ".$fileinfo["name"] 为返回上两级,".. /mysql/ ".$fileinfo["name"] 表示保存在上一级的其他文件夹中。
- 上一篇: 现象:APACHE调用PHP执行慢4到5秒
- 下一篇: 常用的php文件处理函数