资源描述
第,11,章 文件操作,文件的读写,目录的操作,文件指针,上传与下载,目录,文件操作进阶,11.2,11.1,文件操作入门,11.1,文件操作入门,文件读写,读取文件,file_get_contents(),函数,用于将文件的内容全部读取到一个字符串中,string file_get_contents(,string$filename,/,指定要读取的文件路径,bool$use_include_path=false,/,可选,在,php.ini,中配置的,include_path,路径里搜寻文件,resource$context,/,可选,用于资源流上下文操作,int$offset=0,/,可选,指定在文件中开始读取的位置,默认从文件头开始,int$maxlen /,可选,用于指定读取的最大字节数,默认为整个文件的大小,),11.1,文件操作入门,文件读写,读取文件,/,相对路径,$filename=./123.txt;,echo file_get_contents($filename);/,输出当前目录下的,123.txt,文件内容,/,绝对路径,$filename=C:/Windows/System32/drivers/etc/hosts;,echo file_get_contents($filename);/,输出操作系统的,hosts,文件内容,除了文本文件,,,file_get_contents(),还可以,读取图片等其他类型,的文件,file_get_contents(),函数的使用,具体案例请参考教材,11.1,文件操作入门,文件读写,读取文件,/,只允许访问,PHP,脚本所在的目录,ini_set(open_basedir,C:/web/apache2.4/htdocs);/,或用相对路径“,./”,echo file_get_contents(./123.txt);/,可以读取,echo file_get_contents(C:/web/123.txt);/,无法读取,另外,,open_basedir,不仅,针对文件操作函数有效,,对于,include,、,require,等和文件有关的操作,都会产生影响,。因此,读者在使用时需酌情考虑。,11.1,文件操作入门,文件读写,按行读取文件,file(),函数,可以将整个文件读入到数组中。执行成功,则返回一个数组,数组中的每个元素都是文件中的一行,包括换行符在内。如果执行失败,则返回,false,。,array file(string$filename,int$flags=0,resource$context ),$filename,指定读取的文件路径,,$flags,指定读取方式的选项。,11.1,文件操作入门,文件读写,按行读取文件,关于,$flags,可以,指定的常量,具体如下。,FILE_USE_INCLUDE_PATH,:在,include_path,中查找文件,FILE_IGNORE_NEW_LINES,:指定返回值数组的每个元素值末尾不添加换行符,FILE_SKIP_EMPTY_LINES,:跳过空行,具体案例请参考教材,11.1,文件操作入门,文件读写,写入文件,使用文件记录程序处理后的内容时,可以使用,file_put_contents(),函数,来完成。,int file_put_contents(,string$filename,/,指定要写入的文件路径(包含文件名称),mixed$data,/,指定要写入的内容,int$flags=0,/,可选,指定写入选项,resource$context/,可选,用于资源流上下文操作,),函数执行成功时返回写入到文件内数据的字节数,失败返回,false,。,11.1,文件操作入门,文件读写,写入文件,常量,FILE_USE_INCLUDE_PATH,表示在,include_path,中查找,$filename,常量,FILE_APPEND,表示追加写入,具体案例请参考教材,11.1,文件操作入门,文件常用操作,文件常用操作,文件重命名,移动路径,文件复制,文件删除,11.1,文件操作入门,文件常用操作,文件,重命名和移动路径,rename(),函数,用于实现文件的,重命名或移动,路径,其声明方式如下。,bool rename(string$oldname,string$newname,resource$context ),$oldname,表示原文件路径,$newname,表示目标路径,如果两个文件路径在同一个目录下,执行重命名操作,如果不在同一个目录下,则执行移动操作,该函数执行成功时返回,true,,执行失败返回,false,11.1,文件操作入门,文件常用操作,文件,重命名和移动路径,/,重命名,test.txt,为,test.bak,rename(./test.txt,./test.bak);,/,移动,test.bak,到,C:/web/test.txt,rename(./test.bak,C:/web/test.txt);,需要注意的是,在对文件进行操作时,若目标路径是个已经,存在的,文件,会,自动覆盖,。,11.1,文件操作入门,文件常用操作,文件复制,copy(),函数,用于实现,文件复制,的功能,其声明方式如下。,bool copy(string$source,string$dest,resource$context ),$source,表示原文件路径,$dest,表示目标路径,当文件复制成功时返回,true,,失败时返回,false,11.1,文件操作入门,文件常用操作,文件复制,/,在当前目录下复制文件,copy(./test.txt,./new.txt);,/,跨目录复制文件,copy(./123/test.txt,./456/new.txt);,在进行文件复制时需要注意,若,目标文件已经存在,会自动覆盖,。,11.1,文件操作入门,文件常用操作,文件删除,bool unlink(string$filename,resource$context ),$filename,表示,文件路径,如果,删除成功,返回值为,true,,,失败,则返回,false,unlink(./test.txt);,当前目录下的,test.txt,文件将被删除,若,不存在,则会提示,Warning,错误,语法,示例,11.1,文件操作入门,文件类型和属性,获取文件类型,使用,PHP,的,filetype(),函数,可以获取,文件的类型,,示例代码如下。,echo filetype(./123/1.txt);/,输出结果:,file,echo filetype(./123);/,输出结果:,dir,在,Windows,系统中,,PHP,只能获得,file,(文件)、,dir,(目录)和,unknown,(未知),3,种文件类型,在,Linux,系统中,还可以获取,block,(块设备)、,char,(字符设备)、,fifo,(命名管道)、,link,(符号链接)等文件类型,11.1,文件操作入门,文件类型和属性,获取文件属性,函数,功能,int filesize(string$filename),获取文件大小,int filectime(string$filename),获取文件的创建时间,int filemtime(string$filename),获取文件的修改时间,int fileatime(string$filename),获取文件的上次访问时间,bool is_readable(string$filename),判断给定文件是否可读,bool is_writable(string$filename),判断给定文件是否可写,bool is_executable(string$filename),判断给定文件是否可执行,array stat(string$filename),获取文件的信息,11.1,文件操作入门,文件类型和属性,获取文件属性,由于,PHP,中的,int,数据类型表示的数据范围有限,所以,filesize(),函数,对于大于,2GB,的文件,并不能准确获取其大小,需斟酌使用。,具体案例请参考教材,11.1,文件操作入门,文件类型和属性,获取文件属性,除了上述方式外,还可以使用,stat(),函数,获取文件的,统计信息,,示例代码如下。,print_r(stat(./test.txt);,输出,stat(),函数返回的数组,其输出结果由索引数组和关联数组两种形式组成,11.1,文件操作入门,文件类型和属性,获取文件属性,索引数组,关联数组,说明,0,dev,设备编号,1,ino,inode,编号,2,mode,inode,保护模式,3,nlink,链接数目,4,uid,所有者的用户,ID,5,gid,所有者的组,ID,6,rdev,设备类型,如果是,inode,设备的话,7,size,文件大小的字节数,11.1,文件操作入门,文件类型和属性,获取文件属性,索引数组,关联数组,说明,8,atime,上次访问时间(,Unix,时间戳),9,mtime,上次修改时间(,Unix,时间戳),10,ctime,上次,inode,改变时间(,Unix,时间戳),11,blksize,文件系统,IO,的块大小,12,blocks,所占据块的数目,11.1,文件操作入门,目录操作,计算机中的文件为了便于搜索和管理,通常将,文件,分,目录进行存储,。为此,,PHP,提供了相应的函数来操作目录,例如创建目录、删除目录、遍历目录等。,11.1,文件操作入门,目录操作,创建目录,在,PHP,中,,mkdir(),函数,用于,创建目录,,其声明方式如下。,bool mkdir(,string$pathname,/,指定要创建的目录,int$mode=0777,/,可选,指定目录的访问权限(用于,Linux,环境),bool$recursive=false,/,可选,指定是否递归创建目录,resource$context/,可选,用于资源流上下文操作,),该函数执行成功返回,true,,失败返回,false,。,11.1,文件操作入门,目录操作,创建目录,mkdir(./test);/,创建目录,mkdir(./test1/test2,0777,true);/,递归创建目录(若,test1,不存在会自动创建),通过指定,mkdir(),函数的第,3,个参数为,true,,可以自动创建给定路径中不存在的目录,而若省略该参数,则会失败并提示,Warning,错误,当要创建的最后一级目录已经存在时,也会创建失败并提示,Warning,错误。,11.1,文件操作入门,目录操作,删除,目录,与,mkdir(),函数相对应,,rmdir(),函数,用于,删除目录,,其声明方式如下。,bool rmdir(string$dirname,resource$context ),$dirname,指定要删除的目录名,函数执行成功时返回,true,,失败返回,false,11.1,文件操作入门,目录操作,删除,目录,rmdir(./test);/,删除空目录(删除成功),rmdir(./test1);/,删除非空目录(删除失败),rmdir(./test1/test2);/,删除空目录(删除成功),示例,使用,rmdir(),进行删除时,会删除失败并提示,Warning,错误,因此,对于非空目录,只有先清空里面的文件,才能够删除目录,11.1,文件操作入门,目录操作,遍历,目录,glob(),函数,用于寻找与模式(,pattern,)匹配的,文件路径,,也可以用于,遍历目录,array glob(string$pattern,int$flags=0 ),$pattern,表示匹配模式,其写法与,libc,(,C,语言函数库)中的,glob(),函数指定的模式相同,$flags,用于指定一些选项,如,GLOB_MARK,表示在每个目录后面加一个斜线,,GLOB_ONLYDIR,表示仅返回与模式匹配的目录项,函数的返回值是查找后的文件列表数组,11.1,文件操作入门,目录操作,遍历,目录,print_r(glob(./*);/,获取当前目录下的文件列表,print_r(glob(./*.txt);/,获取当前目录下所有的“,txt”,扩展名的文件,Array(,0=./test 1=./test.php 2=./file.php,11.1,文件操作入门,解析路径,在程序中经常需要对,文件路径进行操作,,如解析路径中的文件名或目录等。,pathinfo(),函数,basename(),函数,dirname(),函数,11.1,文件操作入门,解析路径,basename(),函数,basename(),函数,用于返回路径中的,文件名,,其声明方式如下。,string basename(string$path,string$suffix ),$path,用于指定路径名,$suffix,是可选参数,如果指定了该参数,且文件名是以,$suffix,结尾的,则返回的结果中会被去掉这一部分字符,11.1,文件操作入门,解析路径,basename(),函数,$path=C:/web/apache2.4/htdocs/index.html;,echo basename($path);/,输出结果:,index.html,echo basename($path,.html);/,输出结果:,index,利用,basename(),函数的第,2,个参数可以去掉文件名中的扩展名。,示例,11.1,文件操作入门,解析路径,dirname,(),函数,dirname(),函数,用于返回路径中的,目录部分,,其声明方式如下。,string dirname(string$path,int$levels=1 ),$path,用于指定路径名,$level,是,PHP 7,新增的参数,表示上移目录的层数,11.1,文件操作入门,解析路径,dirname,(),函数,$path=C:/web/apache2.4/htdocs/index.html;,echo dirname($path);/,输出结果:,C:/web/apache2.4/htdocs,echo dirname($path,2);/,输出结果:,C:/web/apache2.4,echo dirname($path,3);/,输出结果:,C:/web,利用,dirname(),函数可以轻松获取文件的所在目录,11.1,文件操作入门,解析路径,pathinfo,(),函数,pathinfo(),函数,用于以数组形式,返回路径的信息,,包括目录名、文件名和扩展名等,mixed pathinfo(string$path,int$options=PATHINFO_DIRNAME|,PATHINFO_BASENAME|PATHINFO_EXTENSION|PATHINFO_FILENAME ),$path,用于指定路径名,$options,用于指定要返回哪些项,默认返回全部,,,具体包括,PATHINFO_DIRNAME,(目录名)、,PATHINFO_BASENAME,(文件名)、,PATHINFO_EXTENSION,(扩展名)、,PATHINFO_FILENAME,(不含扩展名的文件名),11.1,文件操作入门,解析路径,pathinfo,(),函数,$path=C:/web/apache2.4/htdocs/index.html;,$info=pathinfo($path);,echo$infodirname;/,输出结果:,C:/web/apache2.4/htdocs,echo$infobasename;/,输出结果:,index.html,echo$infoextension;/,输出结果:,html,echo$infofilename;/,输出结果:,index,pathinfo(),函数的返回值是一个关联数组,通过该数组可以获取路径的信息。,11.2,文件操作进阶,文件指针,打开文件,创建文件指针,利用指针读写,关闭文件,11.2,文件操作进阶,文件指针,打开文件,在,PHP,中,打开文件使用的是,fopen(),函数,,其声明方式如下。,resource fopen(string$filename,string$mode,bool$use_include_path=false,resource$context ),$filename,表示打开的文件路径,,包括,本地文件,,HTTP,或,FTP,协议的,URL,地址,$mode,表示文件打开的模式,$use_include_path,表示是否需要在,include_path,中搜寻文件,$context,用于资源流上下文操作,该函数执行成功后,返回资源类型的文件指针,用于其他操作,11.2,文件操作进阶,文件指针,打开文件,模式,说明,r,只读方式打开,将文件指针指向文件头,r+,读写方式打开,将文件指针指向文件头,w,写入方式打开,将文件指针指向文件头并将文件大小截为,0,w+,读写方式打开,将文件指针指向文件头并将文件大小截为,0,a,写入方式打开,将文件指针指向文件末尾,a+,读写方式打开,将文件指针指向文件末尾,x,创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则,fopen(),调用,失败,,,返回,false,,并生成,E_WARNING,级别的错误信息,x+,创建并以读写方式打开,其他行为和“,x,”,相同,对于除“,r,”、“,r+,”模式外的其他操作,如果文件不存在,会尝试自动创建,11.2,文件操作进阶,文件指针,关闭,文件,在,PHP,中,关闭文件,使用的是,fclose(),函数,,其声明方式如下。,bool fclose(resource$handle),fclose(),函数只有,1,个参数,$handle,,表示,fopen(),函数成功打开文件时返回的文件指针。,如果文件关闭成功返回,true,,失败返回,false,。,11.2,文件操作进阶,文件指针,读取文件,(,1,),fread(),函数,用于,读取指定长度的字符串,,其声明方式如下。,string fread(resource$handle,int$length),$handle,参数表示文件指针,$length,用于指定读取的字节数,该函数在读取到,$length,指定的字节数,或读取到文件末尾时就会停止读取,返回读取到的内容,当读取失败时返回,false,具体案例请参考教材,11.2,文件操作进阶,文件指针,读取文件,当使用,fread(),读取文件时,会影响文件指针指向的文件位置。,通过,ftell(),函数可以返回当前文件指针的位置,通过,rewind(),函数可以倒回文件指针的位置,$handle=fopen(./test.txt,r);/,打开文件,fread($handle,9);/,读取,9,个字节,echo ftell($handle);/,输出结果:,9,rewind($handle);/,倒回文件指针,echo ftell($handle);/,输出结果:,0,11.2,文件操作进阶,文件指针,读取文件,(,2,),fgetc(),函数,用于在打开的文件中,读取一个字符,,其声明方式如下。,string fgetc(resource$handle,$handle,表示文件指针,该函数每次只能读取一个字节。,如果遇到,EOF,(,End Of File,,文件结束符标志)时,返回,false,。,11.2,文件操作进阶,文件指针,读取文件,$filename=./test.txt;,file_put_contents($filename,itheima);,$handle=fopen($filename,r);,echo fgetc($handle);/,输出结果:,i,echo fgetc($handle);/,输出结果:,t,fgetc(),示例,11.2,文件操作进阶,文件指针,读取文件,(,3,),fgets(),函数,用于,读取文件中的一行,,其声明方式如下。,string fgets(resource$handle,int$length ),$length,用于指定读取的字节数。该函数将从文件中读取一行,并返回长度最多为,$length-1,字节的字符串。,在碰到换行符、,EOF,或已经读取了,$length-1,字节后停止。如果没有指定,$length,,则默认值为,1024,字节。,11.2,文件操作进阶,文件指针,读取文件,$filename=./test.txt;,file_put_contents($filename,123456n78);,$handle=fopen($filename,r);,echo fgets($handle,4);/,输出结果:,123,echo str_replace(n,*,fgets($handle);/,输出结果:,456*,fgets(),示例,11.2,文件操作进阶,文件指针,写入,文件,fwrite(),函数,用于,写入文件,,其声明方式如下。,int fwrite(resource$handle,string$string,int$length ),$handle,表示文件指针,$string,表示要写入的字符串,$length,表示指定写入的字节数,如果省略表示写入整个字符串,11.2,文件操作进阶,文件指针,写入,文件,$filename=./test.txt;,$handle=fopen($filename,w);/,以写入方式打开文件,fwrite($handle,test);/,向文件中写入内容,echo file_get_contents($filename);/,输出结果:,test,fwrite($handle,123456);/,继续向文件中写入内容,echo file_get_contents($filename);/,输出结果:,test123456,fwrite(),函数会从文件指针的位置开始写入内容。,需要注意的是,若文件指针的位置原来已经有了内容,会被自动覆盖。,11.2,文件操作进阶,目录句柄,(,1,),opendir(),函数,opendir(),函数,用于打开一个,目录句柄,,其声明方式如下。,resource opendir(string$path,resource$context ),$path,指定要打开的目录路径。,该函数如果执行成功,返回资源类型的目录句柄,如果失败,返回,false,。,11.2,文件操作进阶,目录句柄,(,2,),closedir(),函数,closedir(),函数,用于,关闭目录句柄,,其声明方式如下。,void closedir(resource$dir_handle ),函数执行后没有返回值。,11.2,文件操作进阶,目录句柄,(,3,),readdir(),函数,readdir(),函数,用于从目录句柄中,读取条目,,其声明方式如下。,string readdir(resource$dir_handle ),函数执行成功返回目录中下一个文件的文件名,失败时返回,false,。,11.2,文件操作进阶,目录句柄,(,4,),rewinddir(),函数,rewinddir(),函数,用于,倒回目录句柄,,其声明方式如下。,void rewinddir(resource$dir_handle),函数执行后将,$dir_handle,重置到目录的开头,没有返回值。,具体案例请参考教材,11.2,文件操作进阶,资源流,在前面讲过的如,file_get_contents(),、,fopen(),等函数中,有一个可选参数,$content,,表示,资源流下上文,。,所谓流(,Stream,),是指数据源在程序之间经历的路径,当传输方以二进制流的方式传送某个资源(如文件内容)给接收方时,就形成了一条资源流。,11.2,文件操作进阶,资源流,PHP,提供了,流相关的函数,,用于通过一套统一的操作,来处理文件、网络连接、压缩传输等多种类型的数据源。,为方便开发,,PHP,封装了,“,file:/,”、“,,”、“,ftp:/,”、“,zlib:/,”,等常用协议。,具体案例请参考教材,
展开阅读全文