当前位置: 首页 > 后端技术 > PHP

PHP中的文件系统函数(二)

时间:2023-03-29 18:26:39 PHP

这次我们要学习一些不是很常用,但也很有用的函数。有些可能你看过或用过,有些可能真的没什么印象。它们都是PHP中文件系统相关操作函数的一部分。存在是有道理的,也许只是我们在业务发展中没有接触到而已。别的不管了,先熟悉一下,真正需要的时候,立马就能记住PHP自带了这么一个功能。目录判断、创建、删除、路径缓存信息var_dump(is_dir("./"));//bool(true)var_dump(disk_free_space("./"));//float(7727517696)var_dump(disk_total_space("./"));//float(250790436864)is_dir()函数估计大家比较常用,用来判断给定路径是否存在或者是否正常。一般该函数用于在手动创建目录之前判断目录是否已经创建,常用于上传相关业务场景的开发。disk_free_space()和disk_total_space()是获取指定目录的剩余磁盘空间和总磁盘空间数据的函数。因为我的电脑是Mac系统,总磁盘空间250G,可用空间7G。看来我马上要清理电脑了。var_dump(mkdir("./a"));//bool(true)var_dump(rmdir("./a"));//bool(true)mkdir()函数用于创建目录,其中除了给定的path参数外,还有一个可选参数可以设置目录的文件权限,传一个就可以了0777之类的值。相信这个函数大家都不陌生。大部分上传文件到子目录的能力都是用is_dir()配合mkdir()创建目录。rmdir()用于删除目录。此功能有两个先决条件。一是要删除的目录必须是空的,二是必须有删除目录的权限。如果不满足任何条件,它将报告E_WARNING级别的错误。realpath('./');var_dump(realpath_cache_get());//array(8){//["/Users/zhangyue/MyDoc/blogarticle/dev-blog/php/202010/source"]=>//array(4){//["key"]=>//float(1.4990943845035E+19)//["is_dir"]=>//bool(true)//["realpath"]=>//string(61)"/Users/zhangyue/MyDoc/blogarticle/dev-blog/php/202010/source"//["expires"]=>//int(1603327834)//}//["/Users/zhangyue/MyDoc/blogarticle"]=>//array(4){//["key"]=>//int(8597410586338680)//["is_dir"]=>//bool(true)//["realpath"]=>//string(34)"/Users/zhangyue/MyDoc/blogarticle"//["expires"]=>//int(1603327834)//}//["/Users"]=>//...//...var_dump(realpath_cache_size());//int(673)realpath_cache_get()函数用于获取真实目录缓存的详细信息,我们需要先使用realpath()获取一个目录路径,然后我们就可以看到realpath_cache_get()里面有什么了。可以看出,它返回的数组包含了从第一个目录到本目录的所有目录信息,包括每一级目录的realpath、is_dir等属性信息。realpath_cache_size()获取真实路径缓存大小,即真实路径缓存大小在内存中的使用情况。软链接信息在上一篇文章中,我们学习了如何创建链接文件。这次我们来看两个关于链接信息的小函数。var_dump(readlink('ltest2.txt'));//"test.txt"var_dump(is_link('ltest2.txt'));//bool(true)readlink()函数用于获取软链接所连接的链接真实文件名。上一篇我们创建的ltest2.txt文件就是test.txt文件的软连接。is_link()函数用于判断给定文件是否为链接文件。复制、移动、重命名、删除文件操作var_dump(copy('test.txt','cp_test.txt'));//bool(true)var_dump(is_file("cp_test.txt"));//bool(true)var_dump(move_uploaded_file('test.txt','mv_upload_test.txt'));//bool(false)var_dump(is_file("mv_upload_test.txt"));//bool(false)var_dump(is_uploaded_file("mv_upload_test.txt"));//bool(false)var_dump(copy('test.txt','re_test.txt'));//bool(true)var_dump(rename('re_test.txt','new_re_test.txt'));//bool(true)var_dump(copy('test.txt','del_test.txt'));//bool(true)var_dump(unlink("del_test.txt"));//bool(true)对于文件,copy()是一个非常常用的函数。无论是写代码还是日常办公,复制粘贴等复制操作都是我们工作的重点。PHP提供的copy()函数专门用于文件复制,但需要注意的是必须有文件和复制目标目录的读写权限。move_uploaded_file()文件相信大家都很熟悉了,也是在上传文件的操作中经常用到的一个函数。不过需要注意的是,从文件名可以看出,move_uploaded_file()的作用是移动上传的文件,即$_FILES中tmp中的文件,不能作为copy()功能。从演示代码可以看出,对于普通文件,是不能复制和移动的。is_uploaded_file()函数用于判断要操作的文件是否为PHP上传文件。通过以上两个功能,相信很多人都会想到它们在文件上传中的用途,这里给出一个简单的伪代码。if(!move_uploaded_file('xxxx','xxxx')){if(copy('xxxx','xxxx')){//上传成功}else{//上传失败}}很多教程都会有这样的写法,以及甚至有些框架也会有这样的写法。其实就是先用move_uploaded_file()移动上传的文件,如果失败再用copy()函数再复制一次。如果仍然失败,则认为整个上传操作失败。rename()函数用于重命名文件。其实它类似于Linux系统中的mv命令。is_file()函数用于判断给定文件是否为普通文件。在操作系统中,尤其是Linux系统中,万物皆文件,所以该函数最常用的场景就是判断给定的路径是目录还是文件。很多时候我们会用它来判断上传文件是否成功。正常,或者判断给定的路径是目录还是文件。最后,还有unlink()函数。在PHP中,没有delete或rm之类的函数,unlink()是用来删除文件的。但是,它的命名就好像它要取消链接符号链接文件一样。不管是链接文件还是普通文件,都是通过这个unlink()函数来删除的。文件一次性读取关于文件一次性读取的内容和按字节或按行流读取的内容,我们已经在一篇文章中进行了详细的讲解。大家可以移步到PHP大文件读取操作来查看。所以这里我们简单贴出代码来演示一下。var_dump(file_exists('test.txt'));//bool(true)var_dump(readfile('test.txt'));//asdfasdfint(8)var_dump(file('test.txt'));//array(1){//[0]=>//string(8)"asdfasdf"//}$c=file_get_contents('test.txt');var_dump($c);//string(8)"asdfasdf"var_dump(file_put_contents('fpc_test.txt',$c));//int(8)file_exists()函数是一个专业的判断文件是否存在的函数,上面的is_file()运行后更多的用于上传。而file_exists()是日常代码编写中非常常用的一个函数。readfile()直接将文件内容读入content,file_get_contents()也是这样一个函数,只不过file_get_contents()返回的是字符串格式的文件内容。注意我们var_dump()的结果,file_get_contents()明显标明是string(8)类型,而readfile()直接输出内容,不经过buffer,也就是说类似于phpinfo()这样的函数。需要使用ob_start()等函数将readfile()函数读取的内容放入变量中。我们之前的文章也专门讲过buffers的概念,PHP中的输出缓冲控制。它的返回值是文件中的字节数,也就是后面的int(8)。file()函数将文件的内容保存到一个数组中,默认以行分隔,即每行划分为数组中的一个元素。file_put_contents()是将给定的内容写入文件,file_get_contents()也可以实现复制操作。文件属性var_dump(fileatime('test.txt'));//int(1603243708)var_dump(filectime('test.txt'));//int(1603242166)var_dump(filemtime('test.txt'));//int(1603242166)var_dump(fileinode('test.txt'));//int(8707958352)var_dump(filesize('test.txt'));//int(8)var_dump(文件类型('test.txt''));//string(4)“文件”var_dump(is_executable('test.txt'));//bool(true)var_dump(is_writable('test.txt'));//bool(true)var_dump(is_readable('test.txt'));//bool(true)显然,fileatime()、filectime()、filemtime()分别对应文件的最后访问时间、inode修改时间和修改时间,与Linux系统中文件相关的三个时间概念是一致的.fileinode()用于获取文件的inode信息。filesize()是文件的大小,filetype()是文件的类型信息。is_executable()用于判断文件是否可以执行,is_writable()和is_readable()用于判断文件是否可以写入和读取。这三个函数对应的是文件权限相关的判断。创建不同名称的文件和临时文件var_dump(tempnam('./','t_'));//string(70)"/Users/zhangyue/MyDoc/blogarticle/dev-blog/php/202010/source/t_Gx6S5d"$temp=tmpfile();fwrite($temp,"写入临时文件");fseek($temp,0);//睡眠(30);///tmp/phpU2LZ3V文件echofread($temp,1024),PHP_EOL;//写入临时文件fclose($temp);//直接删除文件。tempnam()函数会根据指定的前缀参数随机生成一个没有重名的空文件。在测试代??码中,我们给的prefix的值为t_,最终生成的文件是t_Gx655d这样的空文件。tmpfile()在上一篇文章中也有说明,它会生成一个临时文件,这个文件一般放在/tmp目录下(如果你没有修改php.ini文件中的相关设置的话)。此函数将在创建文件后返回一个句柄。使用fclose()关闭文件句柄后,文件将立即删除。按照规则返回目录内容foreach(glob("*.txt")as$filename){echo"$filenamesize:".filesize($filename),PHP_EOL;}//cp_test.txt大小8//fpc_test.txt大小8//ltest.txt大小8//ltest2.txt大小8//new_re_test.txt大小8//test.txt大小8//test3.txt大小0foreach(glob("../../202009/*.md")as$filename){echo"$filenamesize:".文件大小($文件名),PHP_EOL;}//./../202009/1.PHP中PDO操作学习(三)预处理类和绑定固定data.md大小:16881//../../202009/10。很好玩的Calendar扩展学习PHP.md大小:8784//../../202009/11。PHP函数学习国际化查看货币和日期信息.md大小:5521//../../202009/12。PHP中日期相关函数(一).md大小:14217//../../202009/13。PHP中日期相关函数(2).md大小:9858//../../202009/2。PHP中PDO操作学习(四)查询结构set.mdsize:12825//../../202009/3.使用SPL库中的对象方法在PHP中转换XML和数组。医学数据大小:6068//../../202009/4。PHP中的MySQLi扩展学习(一)MySQLi简介。MD尺寸:6029//../../202009/5。PHP中的MySQLi扩展学习(二)mysqli类的一些稀有属性方法。MD尺寸:9726//../../202009/6。PHP中的MySQLi扩展学习(三)mysqli.md的基本操作大小:9403//../../202009/7.PHP中的MySQLi扩展学习(四)mySqli事务和preparedstatement.md大小:3556//../../202009/8。PHP之MySQLi扩展学习(五)MySQLI_STMT对象operation.mdsize:7450//../../202009/9.PHP之MySQLi扩展学习(六)MySQLI_result对象operation.mdsize:10650glob函数也是之前讲解过的一个函数,它会按照指定的规则返回目录下的所有文件或目录信息,可以方便的使用目录遍历手术。注意这里的规则参数并不是完整的正则表达式,其支持的语法可以参考相关文档。文件umask操作$old=umask(0);echo$old,PHP_EOL;//18$now=umask();echo$now,PHP_EOL;//0umask()函数是操作当前执行进程的umask信息,和Linux中的umask命令一样,用于指定当前创建目录文件的默认权限信息。在PHP中,umask()将PHP的umask设置为mask&0777并返回原始umask。当PHP用作服务器模块时,umask在每次请求后恢复。具体的umask知识可以参考Linux中的相关内容。读取配置文件信息最后两个函数用于读取PHP类的配置文件信息。什么是PHP类型的配置文件信息?其实就是一个类似于php.ini文件的配置文件,是key=value形式的配置文件。就像Laravel的.env文件也可以使用这两个函数来读取。var_dump(parse_ini_file('/usr/local/etc/php/7.3/php.ini'));//array(133){//["#zend_extension"]=>//string(9)"xdebug.so"//["extension"]=>//string(6)"vld.so"//["engine"]=>//...//...var_dump(parse_ini_file('/usr/local/etc/php/7.3/php.ini',true));//array(38){//["#zend_extension"]=>//string(9)"xdebug.so"//["extension"]=>//string(6)"vld.so"//["PHP"]=>//array(45){//["engine"]=>//string(1)"1"//["short_open_tag"]=>//...//...parse_ini_file()函数是直接读取指定路径下的配置文件的内容,这里我们是直接测试读取php.ini文件。它有一个可选参数,如果设置为true,则返回作为类别数组的结构化内容。$ini=file_get_contents('/usr/local/etc/php/7.3/php.ini');var_dump(parse_ini_string($ini));//array(133){//["#zend_extension"]=>//string(9)"xdebug.so"//["extension"]=>//string(6)"vld.so"//["engine"]=>//...//...var_dump(parse_ini_string($ini,true));//array(38){//["#zend_extension"]=>//string(9)"xdebug.so"//["extension"]=>//字符串(6)"vld.so"//["PHP"]=>//array(45){//["engine"]=>//string(1)"1"//["short_open_tag"]=>//...//...parse_ini_string()从给定的字符串中读取配置信息,还有一个可选参数用于格式化组输出。它与parse_ini_file()完全一样,唯一的区别是一个从文件路径读取,另一个从字符串读取。综上所述,一口气介绍了这么多功能,你都用过了吗?有人要说了,为什么要写这个东东,为什么不直接去看文档呢?那不一样。文档中很多功能的介绍就一句话,示例代码也有英文注释。虽然我们也是搬运工,但我们不仅简单搬了过来,还重写了例子。另外,增加了一些应用场景的介绍!至于评委觉得好不好,那就仁者见仁,智者见智吧!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/7.PHP中的文件系统函数(二).php参考文档:https://www.php。net/manual/zh/ref.filesystem.php============各媒体平台均可搜索【硬核项目经理】