亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

后臺站點文件掃描

2019-11-14 12:30:27
字體:
來源:轉載
供稿:網友

前言遍歷文件scandir給定目錄非法使用dir函數遞歸法路徑解析數據結構設計原理解析代碼實現演示當前目錄父級目錄總結

前言

這幾天在看easyui,看到樹形結構這個組件的時候突發奇想,能不能把站點以目錄樹的形式展示呢?

然后著手實現了一下,具體的來說是實現了對數據層的獲取,還沒有附加到tree組件上。下面就來談談我對這次文件信息抓取的體會吧。

遍歷文件

php中遍歷文件有很多方式,但是適用的場景不盡相同。所以在合適的場合適用合適的方法顯得至關重要,下面簡要的了解一下。

scandir

如果說想找到一款類似于Python中使用os.walk獲取文件目錄信息的優雅的方法,在PHP中就不是那么的方便了,唯一能稱得上簡單的就是scandir函數,但是這個函數并不優雅,其作用就是掃描給定目錄下的文件信息(如果包含子目錄,那就只能顯示到子目錄的層級,再想查看子目錄下的信息,那就不行了,否則會報錯的)。

空口無憑,找個實例來看一下就一目了然了。

給定目錄

<?php/** * Created by PhpStorm. * User: ${郭璞} * Date: 2017/2/3 * Time: 20:25 * Description: scandir函數測試 */$pathinfo = scandir('.');var_dump($pathinfo);

效果如下 正常解析目錄

非法使用

所謂非法使用,就是指給出非目錄文件時的場景,比如我們直接給個文件的路徑,就是這樣了。

<?php/** * Created by PhpStorm. * User: ${郭璞} * Date: 2017/2/3 * Time: 20:25 * Description: scandir函數測試 */$pathinfo = scandir('./scandir.php');var_dump($pathinfo);

非法使用場景

所以,使用scandir函數的時候務必明確這一點,傳正確的參數?。?!

dir函數

既然使用scandir函數不行了,那咱們就換個思路唄。下面介紹一個比較常用的方法。

<?php/** * Created by PhpStorm. * User: ${郭璞} * Date: 2017/2/3 * Time: 20:25 * Description: scandir函數測試 */$path = ".";if(is_dir($path)) { $dirinfo = dir($path); while($file = $dirinfo->read()) { echo "<mark>".$file."</mark><br />"; } $dirinfo->close();}else if (is_file($path)) { echo "<font color='green'>".$path."</font>";}

獲取指定目錄下文件信息

如果將$path='.'換成$path='./scandir.php'。將出現如下結果。 dir函數處理非目錄信息

當然,這兩個方法都沒能實現我們想要的效果。不能突破子目錄的情況,沒辦法遍歷到最底層的文件信息。

遞歸法

既然如此,那就得另尋他法了。我個人覺得遞歸的方法不賴,應該可以靈活地處理這些問題,說做就做。

使用面向過程的PHP編碼方法需要處理外部數組引用問題,顯得代碼不是很容易理解,所以我選擇面向對象的方法,將外部數組封裝到一個類中,專門用于處理這類問題。

<?php/** * Created by PhpStorm. * User: ${郭璞} * Date: 2017/2/3 * Time: 9:32 * Description: 讀取給定目錄及子目錄下文件路徑信息 */class FileWatcher{ public $fileinfo; /** * FileWatcher constructor. * @param $path 給定路徑 */ function __construct(){ $this->fileinfo = array(); } /** * 去除路徑設置信息,析構方法 */ function __destruct() { // TODO: Implement __destruct() method. $this->fileinfo = null; } public function scanDir($path) { if(is_dir($path)) { $tmpdir = dir($path); while($tmpfile = $tmpdir->read()) { if($tmpfile!='.' && $tmpfile!='..') $this->scanDir($path."/".$tmpfile); } $tmpdir->close(); } if(is_file($path)) { array_push($this->fileinfo, $path); } return $this->fileinfo; }}

下面是測試時使用的代碼。

$fileWatcher = new FileWatcher();$result = $fileWatcher->scanDir('.');var_dump($result);

最終實現的效果為: 遞歸效果實現目錄遍歷

路徑解析

單單是這樣,不是很好用。我就想著能不能實現類似于Python中os.walk那樣優雅的獲取相關的信息呢?

數據結構設計

使用過那個方法的應該都了解,獲取到的元組信息非常的詳細,包括路徑啊,目錄級啊什么的非常的詳細。

但是我這邊為了以后使用easyui的tree組件,可能需要處理一下目錄深度的問題,所以我設計了下面的數據結構。比較簡單,但是實用性感覺還是挺強的。

class FileInfo{ // 目錄深度 public $level; // 文件經過的路徑,以數組形勢依次填充 public $pathstep; // 文件的完整路徑 public $fullpath; public function __construct() { //pathstep 存儲當前路徑經過的文件夾信息 $this->pathstep = array(); } public function __destruct() { // TODO: Implement __destruct() method. $this->pathstep = null; $this->level = null; $this->fullpath = null; }}

原理解析

我個人認為原理還是比較簡單的了,那就是以文件分隔符作為計算標準。當然了,需要處理一大堆的路徑適配問題,尤其是./../這樣的相對路徑。

處理完這些之后就輕松多了,使用explode函數將字符串進行分割,裝填到數組中即可。

代碼實現

class PathParser{ PRivate $patharray; private $resultSet; public function __construct($patharray) { // 從外部獲取到處理結果集 $this->patharray = $patharray; // 初始化結果集數組 $this->resultSet = array(); // bean類對象 $this->fileinfo = new FileInfo(); } public function __destruct() { // TODO: Implement __destruct() method. $this->resultSet = null; $this->level = null; $this->fullpath = null; } public function parse() { for ($index=0; $index<count($this->patharray); $index++) { // 賦予完整路徑 $fileinfo = new FileInfo(); $fileinfo->fullpath = $this->patharray[$index]; //計算level $fileinfo->level = $this->parseLavel($fileinfo->fullpath);// echo $fileinfo->level."<------->"; // 計算經過的路徑并進行存儲 $fileinfo->pathstep = $this->parseStep($fileinfo->fullpath);// echo $fileinfo->pathstep."<br />";// var_dump($fileinfo->pathstep); array_push($this->resultSet, $fileinfo); } //返回計算結果,整體作為結果集返回 return $this->resultSet; } /** * 獲取給定路徑所經過的路徑的結果集,將用于分級目錄展示 * @param $fileinfo * @return int */ public function parseStep($fileinfo) { if(!$fileinfo) { echo "<mark>".$fileinfo." path error!</mark>"; exit(); } // 判斷是否為相對路徑是的話去掉第一級目錄。 啊好煩,windows上和linux上差別還這么大,怎么處理好呢。。。 // 還是按照文件在服務器上的位置來進行來處理好了。判斷是不是相對路徑然后再針對“路徑分隔符”計算路徑的level if($this->isRelativePath($fileinfo) == 1) { // 相對路徑處理 // 去掉相對路徑符號 $fileinfo = substr($fileinfo,2, strlen($fileinfo)); // 按照目錄分隔符 作為切割標準,結果就是路徑本身包含的路徑信息 return explode("/", $fileinfo); }else if($this->isRelativePath($fileinfo) == 2){ $fileinfo = substr($fileinfo, 3, strlen($fileinfo)); return explode("/", $fileinfo); }else if ($this->isAbsolutePath($fileinfo)) { // 絕對路徑處理 }else{ // 文件路徑非法 echo "<mark>".$fileinfo." 文件路徑非法</mark>"; exit(); } } public function parseLavel($fileinfo) { if(!$fileinfo) { echo "<mark>".$fileinfo." path error!</mark>"; exit(); } //按照文件在服務器上的位置來進行來處理好了。判斷是不是相對路徑然后再針對“路徑分隔符”計算路徑的level if($this->isRelativePath($fileinfo) == 1) { // 相對路徑處理 // 去掉當前相對路徑符號 $fileinfo = substr($fileinfo,2, strlen($fileinfo)); // 通過計算 路徑分隔符來作為level的判斷標準// echo "<mark>".count(explode("/", $fileinfo))."</mark>"; return count(explode("/", $fileinfo)); }else if ($this->isRelativePath($fileinfo) == 2 ) { //去掉父級目錄信息 $fileinfo = substr($fileinfo, 3, strlen($fileinfo)); return count(explode("/", $fileinfo)); }else if ($this->isAbsolutePath($fileinfo)) { // 絕對路徑處理 // 算了,先不做這塊了,貌似偏離了我這個需求。 }else{ // 文件路徑非法 echo "<mark>".$fileinfo." 文件路徑非法</mark>"; exit(); } } /** * 判斷是否為相對路徑 * @param $path * @return bool * */ private function isRelativePath($path) { // 父級目錄擁有更高的優先級 $prefix = substr($path, 0, 3); if($prefix == "../") { return 2; } // 處理 當前目錄情況 $prefix = substr($path, 0, 2); if ($prefix == "./"){ return 1; }else{ return false; } } /** * 判斷給定路徑是否為絕對路徑 * @param $path * @return bool */ private function isAbsolutePath($path) { $prefix = substr($path, 0, 1); if($prefix=="/"){ return true; }else{ return false; } }}

演示

下面演示一下實現的效果吧。

當前目錄

測試代碼如下

//獲取全部文件以及路徑信息$fileWatcher = new FileWatcher();$result = $fileWatcher->scanDir('.');$pathParser = new PathParser($result);$resultSet = $pathParser->parse();echo json_encode($resultSet);

結果圖 當前目錄信息獲取

父級目錄

對于父級目錄信息獲取,也是非常方便的。之前網上下載了easyui的壓縮包,解壓后扔到了apache服務器上,下面來看看對這個大文件信息集的獲取情況吧。 測試代碼把路徑中的那個.改成../easyui即可。 父級目錄信息獲取

結果還行吧。我看著挺詳細的了。那么到這里就差不多實現預期的效果了。

總結

回顧一下,今天主要是對于文件目錄信息的遍歷。

顯示通過通用的scandir 函數和dir循環讀取方式對目錄進行了讀取,但是效果不佳,于是轉戰遞歸實現。

為了達到一個更加優雅的信息獲取效果,又設計了一個專門針對于文件的類,用于存儲相關數據。

為了處理相對路徑中本級目錄和父級目錄等特殊情況,又使用了substr和explode函數,最后封裝成了一個通用的類,效果還不錯。

缺點嘛,顯而易見。代碼的風格不是很好,命名什么的也是按照我自己的套路來的,不是很正規。

其他的貌似也沒什么了,那就先這樣好了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩国产成人| 久久影视免费观看| 一本一本久久a久久精品综合小说| 欧美性xxxx极品hd满灌| 国产精品专区第二| 91tv亚洲精品香蕉国产一区7ujn| 欧美裸体xxxxx| 国产精品久久久久久久午夜| 久久久视频精品| 91精品成人久久| 亚洲精品网站在线播放gif| 亚洲xxxx视频| 国产精品小说在线| 97超碰色婷婷| 91久久精品国产91久久性色| 午夜精品www| 亚洲精品网站在线播放gif| 欧美日韩国产中文精品字幕自在自线| 九九久久久久99精品| 日韩成人av在线| 亚洲免费精彩视频| 亚洲综合在线播放| 欧美成人中文字幕| 国产成人精品久久二区二区91| 欧美精品电影免费在线观看| 国产精品免费久久久| 亚洲精品国产免费| 成人写真福利网| 日韩精品免费观看| 久久网福利资源网站| 一本色道久久88综合亚洲精品ⅰ| 91在线观看免费| 国产精品亚发布| 这里只有精品在线播放| 亚洲福利视频二区| 亲爱的老师9免费观看全集电视剧| 国产精品久久91| 欧美成人网在线| 亚洲一区二区三区四区视频| 在线观看精品自拍私拍| 久久国产精彩视频| 欧美精品激情blacked18| 插插插亚洲综合网| 久久国产精品偷| 综合国产在线视频| 高清日韩电视剧大全免费播放在线观看| 欧美日韩在线视频一区二区| 国产91精品青草社区| 国产噜噜噜噜噜久久久久久久久| 中文字幕日韩视频| 欧美激情伊人电影| 久久久久久有精品国产| 亚洲精品欧美一区二区三区| 国产欧美日韩免费看aⅴ视频| 欧美美最猛性xxxxxx| 国产91在线播放九色快色| 91亚洲人电影| 国产精品视频久久久久| 91国内免费在线视频| 成人免费淫片视频软件| 欧美精品在线观看91| 国产精品视频不卡| 中文字幕精品一区二区精品| 亚洲天堂av在线免费观看| 久久深夜福利免费观看| 午夜精品久久久久久久99热浪潮| 国产成人鲁鲁免费视频a| 欧美另类xxx| 亚洲第一偷拍网| 欧美猛少妇色xxxxx| 日韩小视频网址| 欧美日韩第一视频| 久久久久久国产免费| 国产精品久久久久久中文字| 国产一区二区视频在线观看| 久久精品国产亚洲一区二区| 欧美电影免费在线观看| xxx成人少妇69| 91精品国产乱码久久久久久久久| 欧美网站在线观看| 久久久久久成人精品| 91精品国产电影| 欧美二区乱c黑人| 2019中文字幕免费视频| 97人洗澡人人免费公开视频碰碰碰| 性欧美办公室18xxxxhd| 亚洲精品福利免费在线观看| 欧美日本黄视频| 国产精品第2页| 欧美激情一区二区三区成人| 国产精品热视频| 国产主播喷水一区二区| 欧美黑人巨大精品一区二区| 欧美午夜精品久久久久久浪潮| 色偷偷91综合久久噜噜| 亚洲精品国产拍免费91在线| 中文字幕久热精品视频在线| 欧美有码在线观看| 日韩女优在线播放| 欧美成年人视频| 亚洲有声小说3d| 蜜臀久久99精品久久久无需会员| 亚洲欧美国产日韩天堂区| 亚洲国产高潮在线观看| 亚洲va国产va天堂va久久| 欧美激情亚洲综合一区| 亚洲色图色老头| 亚洲欧美一区二区精品久久久| 国产午夜精品美女视频明星a级| 国产精品露脸自拍| 国产在线精品一区免费香蕉| 成人在线视频福利| 亚洲自拍小视频| 国产欧美一区二区三区视频| 欧美国产精品人人做人人爱| 一级做a爰片久久毛片美女图片| 亚洲欧美日韩精品久久奇米色影视| 欧美日韩性视频在线| 欧美日本在线视频中文字字幕| 日韩欧美在线第一页| 国产不卡av在线| 久久高清视频免费| 亚洲精品午夜精品| 亚洲精品欧美一区二区三区| 亚洲精品久久久久国产| 一本久久综合亚洲鲁鲁| 久久精品国产欧美亚洲人人爽| 亚洲精品动漫久久久久| 亚洲xxxx妇黄裸体| 久久成人综合视频| 亚洲第一色中文字幕| 欧美激情性做爰免费视频| xxx成人少妇69| 国产成人综合亚洲| 久久国产精品久久久久久久久久| 亚洲r级在线观看| 欧美高清视频在线观看| 日韩av在线网| 狠狠干狠狠久久| 欧美超级免费视 在线| 国产91精品黑色丝袜高跟鞋| 久久久久久久久久久91| 久久久欧美一区二区| 国产精品专区一| 亚洲天堂影视av| 欧洲美女7788成人免费视频| 午夜美女久久久久爽久久| 91九色蝌蚪国产| 91高清免费视频| 久久免费观看视频| 欧美久久精品午夜青青大伊人| 日韩av电影在线免费播放| 亚洲国产又黄又爽女人高潮的| 国产成人欧美在线观看| 在线成人一区二区| 亚洲精品黄网在线观看| 在线一区二区日韩| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲成在人线av| 日韩欧美aaa| 色偷偷av一区二区三区| 中文国产成人精品| 亚洲精品国产精品久久清纯直播| 国产91av在线|