遍历指定目录,并存储目录内所有文件属性信息的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 相关文章推荐
php的字符串用法小结
Jun 08 PHP
php xml 入门学习资料
Jan 01 PHP
fgetcvs在linux的问题
Jan 15 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
php生成图形(Libchart)实例
Nov 06 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 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/10/09 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
Python中处理时间的几种方法小结
2015/04/09 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
数控专业应届生求职信
2013/11/27 职场文书
求职自荐信怎么写
2014/03/06 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis