关于PHP目录操作总结

PHP目录操作(附封装好的目录操作函数文件)

目录函数库常用API

  1. $path='test';
  2. var_dump(is_dir($path));//检测是否为目录
  3. echo '<hr/>';
  4. echo getcwd();//得到当前的工作目录
  5. echo '<hr/>';
  6. //得到磁盘总大小
  7. echo disk_total_space('/');
  8. echo '<hr/>';
  9. //得到磁盘可用空间
  10. echo disk_free_space('/');

创建、删除目录

多级目录

  1. //创建目录
  2. //mkdir($path,$mode,$flag):创建目录
  3. var_dump(mkdir('a'));
  4. //检测目录是否存在,不存在则创建
  5. $path='king';
  6. if(!file_exists($path)){
  7. if(mkdir($path)){
  8. echo '目录创建成功';
  9. }else{
  10. echo '目录创建失败';
  11. }
  12. }else{
  13. echo '目录已存在';
  14. }
  15. //创建多级目录 b/c
  16. $path='b'.DIRECTORY_SEPARATOR.'c';
  17. echo $path;
  18. var_dump(mkdir($path,755,true));
  19. //删除目录
  20. var_dump(rmdir('a'));
  21. var_dump(rmdir('b'));
  22. var_dump(rmdir('a'));

读取目录

  1. $path='webuploader-master';
  2. //打开指定目录
  3. $handle=opendir($path);
  4. var_dump($handle);//resource(5) of type (stream)
  5. //遍历文件,获取类型
  6. while(($item=readdir($handle))!==false){
  7. echo $item,"\n";
  8. echo filetype($path.DIRECTORY_SEPARATOR.$item),"\n";//获取文件类型
  9. echo "\n";
  10. }
  11. //遍历文件,获取类型2
  12. while(($item=readdir($handle))!==false){
  13. //去掉.和..
  14. if($item!='.'&&$item!='..'){
  15. //检测是否是文件
  16. if(is_file($path.'/'.$item)){
  17. echo '文件:',$item,"\n";
  18. }else{
  19. echo '目录:',$item,"\n";
  20. }
  21. }
  22. }
  23. //rewinddir()重置遍历指针
  24. rewinddir();
  25. var_dump(readdir($handle));// .
  26. //关闭句柄
  27. closedir($handle);

DirectoryIterator迭代器的使用

  1. $dir=new DirectoryIterator(__DIR__);
  2. //print_r($dir);
  3. foreach($dir as $fileInfo){
  4. if($fileInfo->getFilename()!='.'&&$fileInfo->getFilename()!='..'){
  5. echo $fileInfo->getFilename(),"\n";//文件名
  6. echo $fileInfo->getType(),"\n";//文件类型
  7. }
  8. }

【超级实用目录相关函数封装】

dir.func.php

  1. /**
  2. * 检测目录是否为空
  3. * @method check_empty_dir
  4. * @param string $path 目录名
  5. * @return boolean true|false
  6. */
  7. function check_empty_dir(string $path){
  8. //检测目录是否存在,存在则打开
  9. if(!is_dir($path)){
  10. return false;
  11. }
  12. //打开指定目录
  13. $handle=opendir($path);
  14. //读取
  15. while(($item=@readdir($handle))!==false){
  16. //去掉.和..操作
  17. if($item!='.'&&$item!='..'){
  18. return false;
  19. }
  20. }
  21. //关闭句柄
  22. closedir($handle);
  23. return true;
  24. }
  25. -------------------
  26. /**
  27. * 读取目录下的所有文件
  28. * @method read_directory
  29. * @param string $path 目录名称
  30. * @return void 直接输出目录下的所有文件及子目录
  31. */
  32. function read_directory(string $path){
  33. if(!is_dir($path)){
  34. return false;
  35. }
  36. $handle=opendir($path);
  37. while(($item=@readdir($handle))!==false){
  38. if($item!='.'&&$item!='..'){
  39. $pathName=$path.DIRECTORY_SEPARATOR.$item;
  40. if(is_file($pathName)){
  41. echo '文件:',$item,'<br/>';
  42. }else{
  43. echo '目录:',$item,'<br/>';
  44. $func=__FUNCTION__;
  45. $func($pathName);
  46. }
  47. }
  48. }
  49. closedir($handle);
  50. }
  51. // read_directory('a');
  52. -------------------
  53. /**
  54. * 遍历目录下所有内容返回
  55. * @method read_directory1
  56. * @param string $path 目录名称
  57. * @return mixed false|array
  58. */
  59. function read_directory1(string $path){
  60. if(!is_dir($path)){
  61. return false;
  62. }
  63. $handle=opendir($path);
  64. while(($item=@readdir($handle))!==false){
  65. if($item!='.'&&$item!='..'){
  66. $pathName=$path.DIRECTORY_SEPARATOR.$item;
  67. if(is_file($pathName)){
  68. $arr['file'][]=$pathName;
  69. }elseif(is_dir($pathName)){
  70. $arr['dir'][]=$pathName;
  71. $func=__FUNCTION__;
  72. $func($pathName);
  73. }
  74. }
  75. }
  76. closedir($handle);
  77. return $arr;
  78. }
  79. // $res=read_directory1('a');
  80. // print_r($res);
  81. -------------------
  82. /**
  83. * 读取目录中的所有文件
  84. * @method get_all_files
  85. * @param string $path 目录名称
  86. * @return mixed false|array
  87. */
  88. function get_all_files(string $path){
  89. if(!is_dir($path)){
  90. return false;
  91. }
  92. if($handle=opendir($path)){
  93. $res=[];
  94. while(($item=readdir($handle))!==false){
  95. if($item!='.'&&$item!='..'){
  96. $pathName=$path.DIRECTORY_SEPARATOR.$item;
  97. is_dir($pathName)?$res[$pathName]=get_all_files($pathName):$res[]=$pathName;
  98. }
  99. }
  100. closedir($handle);
  101. return $res;
  102. }else{
  103. return false;
  104. }
  105. }
  106. // print_r(get_all_files('a'));
  107. -------------------
  108. /**
  109. * 得到目录大小
  110. * @method get_dir_size
  111. * @param string $path 目录名称
  112. * @return mixed false|int
  113. */
  114. function get_dir_size(string $path){
  115. if(!is_dir($path)){
  116. return false;
  117. }
  118. static $sum=0;
  119. $handle=opendir($path);
  120. while(($item=readdir($handle))!==false){
  121. if($item!='.'&&$item!='..'){
  122. $pathName=$path.DIRECTORY_SEPARATOR.$item;
  123. if(is_file($pathName)){
  124. $sum+=filesize($pathName);
  125. }else{
  126. $func=__FUNCTION__;
  127. $func($pathName);
  128. }
  129. }
  130. }
  131. closedir($handle);
  132. return $sum;
  133. }
  134. // echo get_dir_size('a');
  135. -------------------
  136. /**
  137. * 重命名目录
  138. * @method rename_dir
  139. * @param string $oldName 原目录
  140. * @param string $newName 新目录
  141. * @return boolean true|false
  142. */
  143. function rename_dir(string $oldName,string $newName){
  144. //检测原文件是否存在,或者当前目录下存在同名目录
  145. $dest=dirname($oldName).DIRECTORY_SEPARATOR.$newName;
  146. if(!is_dir($oldName)|| file_exists($dest)){
  147. return false;
  148. }
  149. if(rename($oldName,$dest)){
  150. return true;
  151. }
  152. return false;
  153. }
  154. //重命名
  155. // var_dump(rename_dir('a','aaaa'));
  156. // var_dump(rename_dir('b','c'));
  157. -------------------
  158. /**
  159. * 剪切目录
  160. * @method cut_dir
  161. * @param string $src 原目录
  162. * @param string $dst 新目录位置
  163. * @return boolean true|false
  164. */
  165. function cut_dir(string $src,string $dst){
  166. //检测原目录是否存在,不存在返回false
  167. if(!is_dir($src)){
  168. return false;
  169. }
  170. //检测目录路径是否存在,不存在则创建
  171. if(!is_dir($dst)){
  172. mkdir($dst,755,true);
  173. }
  174. //检测目录路径下是否存在同名目录
  175. $dest=$dst.DIRECTORY_SEPARATOR.basename($src);
  176. if(is_dir($dest)){
  177. return false;
  178. }
  179. //剪切
  180. if(rename($src,$dest)){
  181. return true;
  182. }
  183. return false;
  184. }
  185. // var_dump(cut_dir('d','uploads'));
  186. // var_dump(cut_dir('c','test1'));
  187. // var_dump(cut_dir('test1','test2'));
  188. -------------------
  189. /**
  190. * 拷贝目录操作
  191. * @method copy_dir
  192. * @param string $src 原目录
  193. * @param string $dst 目标路径
  194. * @return boolean true|false
  195. */
  196. function copy_dir(string $src,string $dst){
  197. //检测原目录是否存在
  198. if(!is_dir($src)){
  199. return false;
  200. }
  201. //检测目标目录是否存在,不存在则创建
  202. if(!is_dir($dst)){
  203. mkdir($dst,755,true);
  204. }
  205. //检测目标目录下是否存在同名文件
  206. $dest=$dst.DIRECTORY_SEPARATOR.basename($src);
  207. if(is_dir($dest)){
  208. return false;
  209. }
  210. $handle=opendir($src);
  211. while(($item=@readdir($handle))!==false){
  212. if($item!='.'&&$item!='..'){
  213. if(is_file($src.DIRECTORY_SEPARATOR.$item)){
  214. copy($src.DIRECTORY_SEPARATOR.$item,$dst.DIRECTORY_SEPARATOR.$item);
  215. }
  216. if(is_dir($src.DIRECTORY_SEPARATOR.$item)){
  217. $func=__FUNCTION__;
  218. $func($src.DIRECTORY_SEPARATOR.$item,$dst.DIRECTORY_SEPARATOR.$item);
  219. }
  220. }
  221. }
  222. closedir($handle);
  223. return true;
  224. }
  225. // var_dump(copy_dir('uploads','test2/uploads'));
  226. -------------------
  227. /**
  228. * 删除非空目录
  229. * @method del_dir
  230. * @param string $path 目录名称
  231. * @return boolean true|false
  232. */
  233. function del_dir(string $path){
  234. //检测目录是否存在
  235. if(!is_dir($path)){
  236. return false;
  237. }
  238. $handle=opendir($path);
  239. while(($item=@readdir($handle))!==false){
  240. if($item!='.'&&$item!='..'){
  241. $pathName=$path.DIRECTORY_SEPARATOR.$item;
  242. if(is_file($pathName)){
  243. @unlink($pathName);
  244. }else{
  245. $func=__FUNCTION__;
  246. $func($pathName);
  247. }
  248. }
  249. }
  250. closedir($handle);
  251. rmdir($path);
  252. return true;
  253. }
  254. // var_dump(del_dir('test2'));

DIRECTORY_SEPARATOR

在 windows 我们习惯性的使用“\”作为文件分隔符,但是在 linux 上系统不认识这个标识,于是就要引入这个 php 内置变量了:DIRECTORY_SEPARATOR。

比如开发机器是 windows,有一个图片上传程序,而使用了(\)作为文件分隔符,调试机器上指定的上传文件保存目录:define('ROOT',dirname(__FILE__)."\upload"),在本地调试都很正常,但是上传到 linux 服务器的时候会发现会出错。这个问题就是出在文件的分隔符上,windows 上习惯性的使用\作为文件分隔符,但是在 linux 上只认识“/”,

于是就要引入下面这个 php 内置变量 DIRECTORY_SEPARATOR。