宝哥软件园

详细讨论PHP文件目录的基本操作

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

我们知道,临时声明的变量存储在内存中,甚至静态变量也会在脚本运行后释放。所以,长期保存一个变量内容的方法之一就是把它写到一个文件里,放在硬盘或者服务器上,所以你一定要熟悉文件操作。

1.文件属性信息获取

首先,文件有类型。在Linux下,有block (block设备,比如磁盘分区和cd-r om)、char(以字符作为输入的设备,比如键盘和打印机)、dir(目录类型,也是文件的一种)、fifo(命名管道,解释为将信息从一个进程传输到另一个进程)、file(普通文件)、link(文件)Linux渣意味着我们必须做好Linux-_-,因为人是为Linux而生的。

关于获取类型有几个函数:filetype:获取类型;Is_file:判断是否为正常文件;Is_link:判断是否为链接。

获取属性有几种功能:

File_exists:确定文件或目录是否存在;

文件大小:获取文件大小;

is _可读、is _可写、is _可执行:是否可读、可写、可执行;

Filctime、filemtime、fileatime:获取文件的创建时间(create)、修改时间(modify)、访问时间(access),并返回时间戳;

Stat:获取文件的一些基本信息,并返回一个索引和关联的混合数组。

例如,您可以如下判断文件类型:

复制代码代码如下:PHP函数get file type($ path){//get file type开关(file type($ path)){ case ' file ' :返回'序数file ';案例“dir”:返回“directory”;case 'block':返回' block device file ';案例“char”:返回“基于char的传输设备”;case 'fifo':返回'命名管道';case 'link':返回'符号链接';default:返回“未知类型”;} }

Filesize以字节为单位返回数据。如果是大文件号或者大文件号,可以先处理号。代码如下

复制代码代码如下:Php //处理文件大小函数getsize ($ path=' ',$ size=-1) {if ($ path!==null $size==-1){ //只通过传递路径来计算大小,或者让它只处理数字$ size=filesize($ path);} if($size=pow(2,40)){返回回合($size/pow(2,40),2)。结核病';} else if($size=pow(2,30)){ return round($size/pow(2,30),2)。' GB ';} else if($size=pow(2,20)){ return round($size/pow(2,20),2)。' MB ';} else if($size=pow(2,10)){ return round($size/pow(2,10,2))。' KB ';} else{ return round($size,2)。字节';} }

现在全面获取文件信息,代码如下:

复制代码代码如下:php函数getFileInfo($path){ if(!File_exists($path)){ //确定文件中是否存在不存在的‘echo’文件!br ';返回;}如果(is_file($path)){ //是文件,则打印基本文件名echo basename($path)。是一个filebr ';}如果(is_dir($path)){ //是目录,则返回目录echo dirname ($ path)。是一个目录br ';}回显“文件类型:”。getFileType($路径)。br ';//获取文件类型echo '文件大小: '。getsize ($ path)。br ';//获取文件大小if(is_readable($path)){ //它是否是可读的echo basename ($ path)。可读br ';} if(is _ write($ path)){//是否echo basename ($ path)。是可写的br ';} if(is_executable($path)){ //是否echo basename ($ path)。是可执行的br '可以执行;} //触摸功能可以修改这些时间回声'文件创建时间: '。日期(' y-m-d h:i 3360s ',fileaction ($ path))。br ';//创建时间回显“filemodify time:”。日期(' y-m-d h:i 3360s ',filemtime ($ path))。br ';//修改时间回显‘上次访问时间:’。日期(' y-m-d h:i 3360s ',fileatime ($ path))。br ';//上次访问时间回应“fileowner :”。fileowner ($路径)。br ';//文件所有者回显“filepermission :”。substr (sprintf ('%o ',(filepermissions ($ path))),-4)。br ';//文件权限,八进制输出回声' filegroup: '。文件组($ path)。br ';//文件所在的组}

效果如下:

代码中还使用了文件权限、组等功能,需要说明(如有误请指正)。一个文件的权限可以分为可读、可写、可执行,一般表示如下:rwx,对应的字母表示可读、可写、可执行,指定的值从开始就是4、2、1,三个值相加的最大结果是7,所以0666用八进制表示,非常方便。7表示这个文件有这三个权限,那么为什么要打印0666呢?众所周知,windows下有一个用户,Linux下也有一个用户,类似于windows,也有一个用户登录,所以一个文件可能是用户所有,一个用户有自己的组,系统中还有其他的组(我猜这应该是管理需要)。因此,对于0666,前6位表示用户对文件的权限。第二个6表示用户所属的组对该文件的权限,第三个6表示其他组的权限(所以不需要一一区分除该组以外的其他用户),第六个知道该文件可读可写(win下所有可执行文件都知道它是一个。exe文件)。

2.目录操作

目录读取,opendir:打开一个目录,返回一个指向目录中内容的句柄。如果目录中的内容被视为顺序数据,如按顺序排列的数组,句柄指向数组的开头。事实上,系统会根据字典对目录中的内容进行排序,无论是文件还是子目录。Readdir:读取下一个目录的内容,返回文件名,并自动指向目录中的下一个文件/目录。因此,读取目录的内容,不包括子目录中的内容,需要一个循环来控制。读取后,应该关闭句柄变量。C语言读文件也是如此。以我的机器为例:

复制代码代码如下:正在读取php //目录$ dir=' f :/';回应“详细信息”。$dir。br ';if(is _ dir($ dir)){ if(($ handle=opendir($ dir))==false){//获取目录句柄回显“opendir失败”;返回;} while(($name=readdir($handle))!=false){ //循环读取此目录中的内容$filepath=$dir。'/'.$ name回声“名称:”。$name。键入:filetype($filepath)。br ';} closedir($ handle);//关闭目录句柄} else {echo $ dir。不是目录r ';}

效果如下:

您可以看到,实际上,系统在字典中对目录中的内容进行排序时忽略了大小写。

我们知道文件大小可以通过filesize获得,但是在php中没有计算目录大小的特殊函数。当然,php有disk_total_space和disk_free_space的功能来计算硬盘的大小,但是我尝试了disk_free_space,好像是错的。因为文件大小用于计算文件的大小,所以需要递归。如果是目录,进去继续计算子目录的大小。如果是文件,获取文件大小并添加回来。代码如下:

复制代码代码如下:Php //目录大小计算函数getdirsize($ dirpath){ $ size=0;如果(假的!=($ handle=opendir($ dirpath)){ while(false!=($ file=readdir($ handle)){ if($ file==' . '| | $ file==' . ')//注意过滤目录中的点和点继续;$filepath=$dirpath。'/'.$ file//路径if(is_file($filepath)){ //是文件的计算大小$ size=file size($ file path);} else if(is _ dir($ file path){//是目录;继续计算这个目录下的文件:$ size=getDirSize($ file path);} else { $ size=0;} } closedir($ handle);}返回$ size} $ dirsize=' f :/size ';$ size=getDirSize($ dirsize);回显“dir size:”。getSize(null,$size)。brbr ';//调用前面的数据处理函数

我在f盘创建了一个大小文件,随机得到了子目录和文档。效果如下:左边的是程序获取的,右边的是右击文件夹属性比较得到的。

主要使用目录创建和删除,mkdir:新建目录,rmdir:删除非空目录,注意只能是非空的,代码如下:

复制代码代码如下:创建和删除php //目录$ newDirPath=' f :/newDir ';If (true==@ mkdir ($ new dirpath,0777,true)) {//add @因为php本身可能会抛出一个警告echo' create directory '。$新目录路径。当文件已经存在时,成功br “;} else { if(file _ exists($ newDirPath))回显“directory”。$newDirPath。”已存在;else回显“创建目录”。$newDirPath。failed br ';} if(true==@ rmdir(' f :/AAA ')//只能删除非空目录。如果删除不存在的目录,将自动引发警告性的回显“remove success br ”;

那么问题来了。如果你想删除一个非空目录,你必须自己写。这个想法仍然是递归的。因为php只提供了delete file函数unlink,所以在删除一个目录的时候,先opendir然后回车。如果直接删除文件,如果是目录,继续使用此方法。当然,已经返回了一个bool变量来指示删除是否成功。代码如下:

复制代码代码如下:Php //删除文件unlink //删除目录中的内容,然后删除目录函数cleardir($ dirpath){ if(file _ exists($ dirpath)){ if(false!=($ handle=opendir($ dirpath)){ while(false!=($ name=readdir($ handle)){ if($ name==' . '|| $name==' . ')继续;$filename=$dirpath。'/'.$ nameif(is _ dir($ filename))clearDir($ filename);if(is _ file($ filename))@ unlink($ filename);} closedir($ handle);rmdir($ dir path);} else { return false} } else { return false}返回true}

在这里,我不得不说有两个鬼(点和点)。在操作系统的每个文件夹下,都会有。还有。表示当前目录及其父目录。可恨的是在读取前面的目录时没有显示出来,导致递归函数变成了无限循环,因为。和.必须首先在每个目录的前面阅读它们。如果不过滤,请先阅读。这意味着这个目录,然后递归地进入这个目录.这两个是操作系统下的默认目录,它们是这个目录和它的父目录之间的连接器。

通过计算目录的大小,删除非空目录的代码,编写、复制和剪切目录非常容易。类似于递归思想,您需要使用复制文件功能复制和文件移动功能重命名。这很有趣。重命名字面意思是重命名,但是重命名到另一个目录不仅仅是剪切-_-

3.阅读和书写文档

php中的一些文件读取操作与C语言中的非常相似,所以相对简单。步骤是打开文件获取句柄,检查错误,然后读写,然后关闭它。养成打开文件后关闭的好习惯。请记住,如果您没有用C语言关闭文件,如果您打开它两次,您将报告一个错误。不知道大家记的对不对,这么严格的程序都有很多处理,比如先验证文件的存在,再验证可读性和可写性。然后先关上,再打开。打开时,你必须检查它是否是错误的.打开文件时,应该选择打开文件的模式,这决定了我们是读还是写文件,当然这对需要这个操作的函数很有用。

写文件的功能只有几个,比如fwrite、fputs、file_put_contents,其中fwrite和fputs的作用是一样的,file_put_contents一次写东西到一个文件,所以不需要指定打开方式,也可以追加或者覆盖现有的文件内容,比如:

复制代码代码如下:Php //write fwrite(别名fputs)$ file path=' f :/10m . txt ';函数write some($ file path){ if(($ handle=fopen($ file path,' r ')==true){ for($ I=0;$ i10$i ) fwrite($handle,$i . '写点东西 r n ');//windws将rn作为换行符fc lose($ handle);} } file_put_contents($filepath,'使用file_put_contents函数',FILE _ APPEND);//附加内容

读取文件的函数有很多,比如fread(读取指定字节)、fgetc(读取一个)、fgets(读取一行)、file(读取全部,分配到一个数组中并按行返回)、file_get_contents(默认读取所有返回字符串)、readfile(直接将文件中的内容输出到缓存中,效果是直接在浏览器上输出)因此,连续读取最好用循环控制。如果我读了文件的结尾该怎么办?EOF标记表示我已经到达文件的末尾。最好使用feof来检测我是否已经到达文件的末尾。话不多说,看看代码:

复制代码代码如下:Php //fread reads函数读取一些($ file path){ if(($ handle=@ fopen($ file path,' r ')==true){ while(!Feof($handle)){ //判断是否到达文件末尾$str=fread($handle,10);//当Fread读取时,文件指针会自动向后移动echo $str。br ';} } }

如果想读得更灵活,应该配合fseek和倒带,可以将文件指针移动到特定位置。fseek非常灵活,可以直接移动到开头或结尾,也可以从当前位置向前或向后移动以读取所需内容。ftell还可以告知当前位置,例如:

复制代码代码如下:php函数readFun($ file path){ if($ handle=@ fopen($ file path,' r ')!=false){ echo '当前位置: '。ftell($handle)。br ';//输出文件的当前文件指针位置以字节计算,0表示$str=fread的开头($handle,3);//读取3字节,指针自动后移3字节回显‘读取内容:’。$ str。br ';回应“当前位置:”。ftell($handle)。br ';fseek($handle,5,SEEK _ CUR);//将文件指针从当前位置回显“currentposition:”后移5个字节。ftell ($ handle)。br ';$str=fread($handle,5);echo“读取内容:”。$str。br ';回应“当前位置:”。ftell($handle)。br ';倒带($ handle);//返回回声“currentposition:”。ftell ($ handle)。文件开头的“br ”;fseek($handle,0,SEEK _ END);//移至文件结尾,回显“currentposition:”。ftell ($ handle)。br ';fc lose($ handle);//关闭文件}}

例如,我现在用这个方法读取一个从A到Z的文本文件,看到的效果是:

以上就是php关于目录文件操作的全部内容,也是个人的理解记录。希望对大家有帮助

更多资讯
游戏推荐
更多+