项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。
想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK了事。
项目过程中,便于操作,使用了json格式存储,但是也发现了一些问题。谨此记录问题及代码,便于参考。
<?phpdefine('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];}