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

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

PHP遍历指定目录,并存储目录内所有文件属性信息的更多相关文章

  1. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

  2. C#遍历指定路径下的目录

    通过指定路径訪问路径下的文件.在C#的开发中主要利用了Directory类和DirectoryInfo类,简要介绍Directory类中的成员:命名空间 System.IO 命名空间 1.Create ...

  3. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  4. [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]

    Windows API中,有一组专门的函数和结构,用于遍历目录,它们是FindFirstFile函数.FindNextFile函数和WIN32_FIND_DATA结构.使用FindFirstFile和 ...

  5. java-IO流(File对象-深度遍历指定目录下的文件夹和文件)

    需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...

  6. delphi遍历指定目录下指定类型文件的函数

    遍历指定目录下指定类型文件的函数// ================================================================// 遍历某个文件夹下某种文件,/ ...

  7. Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)

    private void SMT(HttpContext context) { string SqlConnection82 = System.Configuration.ConfigurationM ...

  8. Android 4.0以后正确的获取外部sd卡存储目录

    刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...

  9. Ubuntu上更改MySQL数据库数据存储目录

    之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...

随机推荐

  1. centos7网卡名修改

    centos7网卡名不是以etho的方式命名,有时候在自动化方面不便于管理,在安装的时候输入如下代码即可命名: net.ifnames=0  biosdevname=0

  2. SQL存储过程使用参考代码

    存储过程   use EBuy go  --常用的系统存储过程  sp_addmessage  --将新的用户定义错误消息存储在SQL Server数据库实例中  sp_helptext  --显示用 ...

  3. Codeforces 659G Fence Divercity dp

    Fence Divercity 我们设a[ i ] 为第 i 个围栏被切的最靠下的位置, 我们发现a[ i ] 的最大取值有一下信息: 如果从i - 1过来并在 i  结束a[ i ] = min(h ...

  4. Codeforces 643C Levels and Regions 斜率优化dp

    Levels and Regions 把dp方程列出来, 把所有东西拆成前缀的形式, 就能看出可以斜率优化啦. #include<bits/stdc++.h> #define LL lon ...

  5. 018 spark on yarn (Job history)的配置,主要是yarn处跳转到历史聚合页面

    一:目标 1.目标 在yarn的8080页面可以跳转到spark的日志18080页面. 因为在运行spark之后,看对应的job的日志,这样直接连接,更合理直接. 2.总结 在后面可以看到,其实不需要 ...

  6. CentOS root用户修改密码

    1.root用户修改密码: #passwd -------------------------------- 参考资料: 1.Centos修改root密码:http://blog.163.com/wz ...

  7. UVA 129困难的串【DFS】

    题目链接 题目大意: 给出n,l:要求按特定格式输出由前l个大写字母构成的按字母表排列的第n个没有连续重复子串的字符串以及该字符串长度. 此题是一道dfs递归回溯的基础题,难点在于对当前字符串是否有连 ...

  8. python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)

    python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...

  9. 8,EasyNetQ-多态发布和订阅

    您可以订阅一个接口,然后发布该接口的实现. 我们来看一个例子. 我有一个接口IAnimal和两个实现猫和狗: public interface IAnimal { string Name { get; ...

  10. Flask的使用2

    1.Flask文件的配置 # 方式一: # 直接书写 app.config['SESSION_COOKIE_NAME'] = 'session_lvning' # 方式二: #引入setting.py ...