遍历指定目录,并存储目录内所有文件属性信息的php代码

5年以前  |  阅读数:547 次  |  编程语言: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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例