malike 发表于 2018-2-11 12:03:09


            
http://files.jb51.net/file_images/article/201610/2016102884444557.png?20169288453
http://files.jb51.net/file_images/article/201610/2016102884512581.png?201692884522
项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。
想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK了事。
项目过程中,便于操作,使用了json格式存储,但是也发现了一些问题。谨此记录问题及代码,便于参考。
$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
页: [1]
查看完整版本: 遍历指定目录,并存储目录内所有文件属性信息的php代码