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


Posted in PHP onOctober 28, 2016

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

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

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

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

<?php
  define('INDEXFORMAT',"dir,name,size,perms,ower,group,ctime,mtime,atime,suffix") ;
  define('INDEXTXT', 'data/index.txt');
  define('INDEXJSON', 'data/index.json');
  date_default_timezone_set('Asia/Hong_Kong');






  if (file_exists(INDEXTXT)) {
    unlink(INDEXTXT);
  }
  $dir = './';
  getIndexFile($dir);
  



  /*
  *  get index file
  *  @filename   INDEXTXT
  *  @dir     string
  *
  */
  function getIndexFile($dir,$whitelist=''){
    $string = '';
    $dir = trim($dir);
    $dir = realpath($dir);
    $dir = $dir."//";
    if(is_file($dir)){
      putIndexFile($dir);
    }else{
      putIndexFile($dir);
      $oDir = @opendir($dir);
      while($fileName = readdir($oDir)){
        if($fileName!='.' && $fileName!='..'){
          if(is_file($dir.$fileName)){
            putIndexFile($dir.$fileName);
          }elseif(is_dir($dir.$fileName)){
            getIndexFile($dir.$fileName);
          }
        }
      }
    }
    if (!file_exists(INDEXTXT)) {
      return false;
    }
    //$data = json_encode(getIndexFromFile());
    //file_put_contents(INDEXJSON,$data);
    return true;
  }

  /*
  *  Get Index file
  *  @filename   file.index
  *
  */
  function putIndexFile($file){
    if (!file_exists($file)) {
      return false;
    }
    $format = explode(',', INDEXFORMAT);
    $string = "";
    foreach ($format as $key => $value) {
      if($key !== 0 ){
        $string .= "\t";
      }
      $string .= getFileAttr($file,$value); 
    }
    $string .= "\n";
    file_put_contents(INDEXTXT, $string, FILE_APPEND);
  }

  /*
  *
  *  Get index string from index file
  *  @return   Array()
  *  
  */
  function getIndexFromFile($flag=''){
    if (!file_exists(INDEXTXT)) {
      return false;
    }
    $arr = file(INDEXTXT);
    $format = explode(',', INDEXFORMAT);
    $result = array();
    if(!empty($flag)){
      $key = array_search($flag, $format);
      if ($key === false) {
        return false;
      }
      foreach ($arr as $str) {
        $tmp = explode("  ", trim($str));
        $result[$flag][] = $tmp[$key];
      }
    }else{
      foreach ($arr as $str) {
        $tmp = explode("  ", trim($str));
        foreach ($format as $key => $value) {
          $result[$value][] = $tmp[$key];//经测试这个操作比较耗时,大概0.7s的样子,慎用!
        }
      }
    }
    return $result;
  }



  /*
  *  get file attributes
  *  @var   $file
  *  @var   $flag
  *  @return String
  */

  function getFileAttr($file,$flag){
    if (!file_exists($file)) {
      return false;
    }
    switch ($flag) {
      case 'dir':
        if(is_file($file))
          return dirname($file);
        return realpath($file);
        break;
      case 'name':
        if(is_file($file))
          return basename($file);
        return '-';
        break;
      case 'size':
        if(is_file($file))
          return filesize($file);
        return '-';
        break;
      case 'perms':
        return substr(sprintf('%o', fileperms($file)), -4);;
        break;
      case 'ower':
        return fileowner($file);
        break;
      case 'group':
        return filegroup($file);
        break;
      case 'ctime':
        return filectime($file);
        break;
      case 'mtime':
        return filemtime($file);
        break;
      case 'atime':
        return fileatime($file);
        break;
      case 'suffix':
        if(is_file($file))
          return substr($file, strrpos($file, '.')+1);
        return '-';
        break;
      default:
        return false;
        break;
    }
  }
  



  /*
  *  get file size human readable
  */
  function getFileSizeFormat($file){
    if(!is_file($file)){
      return '-';
    }
    $flags = array('', 'K', 'M', 'G', 'T');
    for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
    return round($size, 2).$flags[$i];
  }

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

PHP 相关文章推荐
提问的智慧
Oct 09 PHP
桌面中心(三)修改数据库
Oct 09 PHP
Smarty模板快速入门
Jan 04 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
解析yii数据库的增删查改
Jun 20 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
php微信开发之关注事件
Jun 14 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 #PHP
PHP图像识别技术原理与实现
Oct 27 #PHP
PHP对称加密函数实现数据的加密解密
Oct 27 #PHP
PHP下的浮点运算不准的解决方法
Oct 27 #PHP
php函数mkdir实现递归创建层级目录
Oct 27 #PHP
PHP实现递归目录的5种方法
Oct 27 #PHP
PHP读取大文件的几种方法介绍
Oct 27 #PHP
You might like
如何使用脚本模仿登陆过程
2006/11/22 PHP
优化PHP代码的53条建议
2008/03/27 PHP
php header功能的使用
2013/10/28 PHP
PHP中的Memcache详解
2014/04/05 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
如何使用Python标准库进行性能测试
2019/06/25 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
采购部岗位职责
2013/11/24 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
支部鉴定材料
2014/06/02 职场文书
2014年信访工作总结
2014/11/17 职场文书
董存瑞观后感
2015/06/11 职场文书
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python