当前位置:Gxlcms > php框架 > 遍历指定目录,并存储目录内所有文件属性信息的php代码

遍历指定目录,并存储目录内所有文件属性信息的php代码

时间:2021-07-01 10:21:17 帮助过:16人阅读

项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。

想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK了事。

项目过程中,便于操作,使用了json格式存储,但是也发现了一些问题。谨此记录问题及代码,便于参考。

  1. <?php
  2. define('INDEXFORMAT',"dir,name,size,perms,ower,group,ctime,mtime,atime,suffix") ;
  3. define('INDEXTXT', 'data/index.txt');
  4. define('INDEXJSON', 'data/index.json');
  5. date_default_timezone_set('Asia/Hong_Kong');
  6. if (file_exists(INDEXTXT)) {
  7. unlink(INDEXTXT);
  8. }
  9. $dir = './';
  10. getIndexFile($dir);
  11. /*
  12. * get index file
  13. * @filename INDEXTXT
  14. * @dir string
  15. *
  16. */
  17. function getIndexFile($dir,$whitelist=''){
  18. $string = '';
  19. $dir = trim($dir);
  20. $dir = realpath($dir);
  21. $dir = $dir."//";
  22. if(is_file($dir)){
  23. putIndexFile($dir);
  24. }else{
  25. putIndexFile($dir);
  26. $oDir = @opendir($dir);
  27. while($fileName = readdir($oDir)){
  28. if($fileName!='.' && $fileName!='..'){
  29. if(is_file($dir.$fileName)){
  30. putIndexFile($dir.$fileName);
  31. }elseif(is_dir($dir.$fileName)){
  32. getIndexFile($dir.$fileName);
  33. }
  34. }
  35. }
  36. }
  37. if (!file_exists(INDEXTXT)) {
  38. return false;
  39. }
  40. //$data = json_encode(getIndexFromFile());
  41. //file_put_contents(INDEXJSON,$data);
  42. return true;
  43. }
  44. /*
  45. * Get Index file
  46. * @filename file.index
  47. *
  48. */
  49. function putIndexFile($file){
  50. if (!file_exists($file)) {
  51. return false;
  52. }
  53. $format = explode(',', INDEXFORMAT);
  54. $string = "";
  55. foreach ($format as $key => $value) {
  56. if($key !== 0 ){
  57. $string .= "\t";
  58. }
  59. $string .= getFileAttr($file,$value);
  60. }
  61. $string .= "\n";
  62. file_put_contents(INDEXTXT, $string, FILE_APPEND);
  63. }
  64. /*
  65. *
  66. * Get index string from index file
  67. * @return Array()
  68. *
  69. */
  70. function getIndexFromFile($flag=''){
  71. if (!file_exists(INDEXTXT)) {
  72. return false;
  73. }
  74. $arr = file(INDEXTXT);
  75. $format = explode(',', INDEXFORMAT);
  76. $result = array();
  77. if(!empty($flag)){
  78. $key = array_search($flag, $format);
  79. if ($key === false) {
  80. return false;
  81. }
  82. foreach ($arr as $str) {
  83. $tmp = explode(" ", trim($str));
  84. $result[$flag][] = $tmp[$key];
  85. }
  86. }else{
  87. foreach ($arr as $str) {
  88. $tmp = explode(" ", trim($str));
  89. foreach ($format as $key => $value) {
  90. $result[$value][] = $tmp[$key];//经测试这个操作比较耗时,大概0.7s的样子,慎用!
  91. }
  92. }
  93. }
  94. return $result;
  95. }
  96. /*
  97. * get file attributes
  98. * @var $file
  99. * @var $flag
  100. * @return String
  101. */
  102. function getFileAttr($file,$flag){
  103. if (!file_exists($file)) {
  104. return false;
  105. }
  106. switch ($flag) {
  107. case 'dir':
  108. if(is_file($file))
  109. return dirname($file);
  110. return realpath($file);
  111. break;
  112. case 'name':
  113. if(is_file($file))
  114. return basename($file);
  115. return '-';
  116. break;
  117. case 'size':
  118. if(is_file($file))
  119. return filesize($file);
  120. return '-';
  121. break;
  122. case 'perms':
  123. return substr(sprintf('%o', fileperms($file)), -4);;
  124. break;
  125. case 'ower':
  126. return fileowner($file);
  127. break;
  128. case 'group':
  129. return filegroup($file);
  130. break;
  131. case 'ctime':
  132. return filectime($file);
  133. break;
  134. case 'mtime':
  135. return filemtime($file);
  136. break;
  137. case 'atime':
  138. return fileatime($file);
  139. break;
  140. case 'suffix':
  141. if(is_file($file))
  142. return substr($file, strrpos($file, '.')+1);
  143. return '-';
  144. break;
  145. default:
  146. return false;
  147. break;
  148. }
  149. }
  150. /*
  151. * get file size human readable
  152. */
  153. function getFileSizeFormat($file){
  154. if(!is_file($file)){
  155. return '-';
  156. }
  157. $flags = array('', 'K', 'M', 'G', 'T');
  158. for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
  159. return round($size, 2).$flags[$i];
  160. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

人气教程排行