遍历指定目录,并存储目录内所有文件属性信息的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程序的方法
Mar 09 PHP
php 购物车实例(申精)
May 11 PHP
关于php mvc开发模式的感想
Jun 28 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
Zend Framework页面缓存实例
Jun 25 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
教你php如何实现验证码
Jan 20 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 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
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
js html实现计算器功能
2018/11/13 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
使用Python进行目录的对比方法
2018/11/01 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
党员思想汇报范文
2013/12/30 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
四年级数学教学反思
2014/02/02 职场文书
入党自我评价范文
2014/02/02 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
岗位聘任报告
2015/03/02 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
手残删除python之后的补救方法
2021/06/26 Python