遍历指定目录,并存储目录内所有文件属性信息的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函数解决SQL injection
Oct 09 PHP
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
PHP文件操作实现代码分享
Sep 01 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
有关PHP性能优化的介绍
Jun 20 PHP
php判断访问IP的方法
Jun 19 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
Laravel框架路由设置与使用示例
Jun 12 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
使用adodb lite解决问题
2006/12/31 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
获取URL文件名后缀
2013/10/24 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
详解Vue之计算属性
2020/06/20 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
Python中垃圾回收和del语句详解
2018/11/15 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Python流程控制语句的深入讲解
2020/06/15 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
卖房协议书
2014/04/11 职场文书
私人委托书格式
2014/09/10 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle