English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

지정된 디렉토리를 순회하며 디렉토리 내 모든 파일 속성 정보를 저장하는 php 코드

프로젝트가 필요하면, 지정된 디렉토리에 있는 모든 파일을 순회하며 디렉토리 내의 서브 디렉토리도 순회하는 함수를 작성해야 합니다. 파일의 속성 정보를 출력하고 저장합니다.

요구 사항을 생각해 보면, 단지 ls 뿐입니다. -al 명령어를 사용하여 관련 속성을 가져오면 됩니다. 그리고 순회를 추가하여 끝납니다.

프로젝트 과정에서操作이 편리하기 때문에 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);
    }
      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));
        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];
  }

이것이 본문의 모든 내용입니다. 많은 도움이 되었기를 바랍니다. 또한, 언어 교본을 많이 지지해 주시기 바랍니다.

고지사항: 본문은 인터넷에서 가져왔으며, 저작권자는 모두 소유합니다. 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 내용으로, 이 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용을 발견하면, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com에 이메일을 보내면 (#을 @으로 변경해 주세요) 신고를 하고, 관련 증거를 제공해 주시면, 사실이 확인되면 이 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다.

좋아하는 것