zoukankan      html  css  js  c++  java
  • 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 .= "	";
                }
                $string .= getFileAttr($file,$value); 
            }
            $string .= "
    ";
            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];
        }
  • 相关阅读:
    《Java并发编程实战》(五)---- 任务执行
    《Java并发编程实践》(四)---- 构建阻塞
    《Java并发编程实践》(三)---- 组合对象
    《Java8实战》(三)---- 重构测试和调试
    《Java核心技术》---- 多线程
    《Java并发编程实战》(二)---- 对象的共享
    《Java 8 实战》(三)---- 流
    《Java 8 实战》(二)—— Lambda
    《Java 8 实战》(一)——通过行为参数化传递代码
    Android_问卷调查
  • 原文地址:https://www.cnblogs.com/picaso/p/3461775.html
Copyright © 2011-2022 走看看