遍历指定目录,并存储目录内所有文件属性信息的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中实现进程间通讯
Oct 09 PHP
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
laravel添加前台跳转成功页面示例
Oct 22 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
详解angular应用容器化部署
2018/08/14 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
python求解水仙花数的方法
2015/05/11 Python
Python 类的继承实例详解
2017/03/25 Python
python中count函数简单的实例讲解
2020/02/06 Python
如何理解Python中包的引入
2020/05/29 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
作为网站管理者应当如何防范XSS
2014/08/16 面试题
祖国在我心中演讲稿450字
2014/09/05 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript