遍历指定目录,并存储目录内所有文件属性信息的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 相关文章推荐
用Apache反向代理设置对外的WWW和文件服务器
Oct 09 PHP
在MongoDB中模拟Auto Increment的php代码
Mar 06 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
教你如何快捷的使用cmd访问mysql小技巧
May 26 PHP
php实现对象克隆的方法
Jun 20 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 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
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
jQuery实现简单日历效果
2020/07/05 jQuery
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
如何将python中的List转化成dictionary
2016/08/15 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
如何学习Python time模块
2020/06/03 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
Pycharm中如何关掉python console
2020/10/27 Python
猫咪家具:CatsPlay
2018/11/03 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
调解员先进事迹材料
2014/02/07 职场文书
七一党日活动总结
2014/07/08 职场文书