遍歷指定目錄,并存儲(chǔ)目錄內(nèi)所有文件屬性信息的php代碼
項(xiàng)目需要,需要寫一個(gè)函數(shù),能夠遍歷指定目錄中的所有文件,而且這個(gè)目錄中的子目錄也要遍歷。輸出文件的屬性信息,并存儲(chǔ)。
想想需求,不就是一個(gè)ls -al命令嗎,實(shí)現(xiàn)獲取相關(guān)屬性就好了,再加上一個(gè)遍歷OK了事。
項(xiàng)目過程中,便于操作,使用了json格式存儲(chǔ),但是也發(fā)現(xiàn)了一些問題。謹(jǐn)此記錄問題及代碼,便于參考。
<?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."http://"; 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];//經(jīng)測試這個(gè)操作比較耗時(shí),大概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]; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ThinkPHP模板判斷輸出Empty標(biāo)簽用法詳解
這篇文章主要介紹了ThinkPHP模板判斷輸出Empty標(biāo)簽用法,需要的朋友可以參考下2014-06-06Yii2實(shí)現(xiàn)增刪改查后留在當(dāng)前頁的方法詳解
yii2.0框架是PHP開發(fā)的一個(gè)比較高效率的框架,集合了作者的大量心血,下面這篇文章主要介紹了Yii2如何實(shí)現(xiàn)增刪改查后仍留在當(dāng)前頁的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01Zend Framework教程之Bootstrap類用法概述
這篇文章主要介紹了Zend Framework教程之Bootstrap類用法,簡單分析了Bootstrap的功能,定義,相關(guān)參數(shù)與使用方法,需要的朋友可以參考下2016-03-03使用composer安裝使用thinkphp6.0框架問題【視頻教程】
這篇文章主要介紹了使用composer安裝使用thinkphp6.0框架問題,通過一個(gè)小視頻給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10php實(shí)現(xiàn)在線生成條形碼示例分享(條形碼生成器)
php實(shí)現(xiàn)在線生成條形碼,可以做一個(gè)條形碼生成器,大家參考使用吧2013-12-12Yii數(shù)據(jù)讀取與跳轉(zhuǎn)參數(shù)傳遞用法實(shí)例分析
這篇文章主要介紹了Yii數(shù)據(jù)讀取與跳轉(zhuǎn)參數(shù)傳遞用法,結(jié)合實(shí)例形式分析了Yii中read()與readAll()方法的相關(guān)使用技巧,需要的朋友可以參考下2016-07-07