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];
    }
原文地址:https://www.cnblogs.com/picaso/p/3461775.html