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

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

后臺站點文件掃描

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

前言遍歷文件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
97国产精品人人爽人人做| 亚洲自拍中文字幕| 欧日韩在线观看| 国产精品手机播放| 日韩最新av在线| 国产精品激情av电影在线观看| 91免费在线视频| 久久久精品免费| 精品久久久久久久久久久| 亚洲精品国产福利| 久久999免费视频| 欧美日韩激情视频| 茄子视频成人在线| 欧美日韩国产中文精品字幕自在自线| 久久久久久18| 中文国产亚洲喷潮| 欧美日韩国产一区二区三区| 亚洲男人天堂视频| 俺也去精品视频在线观看| 国产亚洲综合久久| 欧美另类交人妖| 国外成人性视频| 麻豆国产va免费精品高清在线| 亚洲精品免费网站| 欧美xxxx18性欧美| 一区二区三区天堂av| 国产不卡av在线| 欧美另类老肥妇| 欧美激情欧美狂野欧美精品| 亚洲在线一区二区| 久久久亚洲精品视频| 91夜夜揉人人捏人人添红杏| 91精品国产高清自在线| 国产精品久久久久久搜索| 91免费观看网站| 午夜免费在线观看精品视频| 精品无码久久久久久国产| 亚洲成人av在线| 国产精品99久久久久久久久久久久| 亚洲欧美精品中文字幕在线| 欧美在线激情网| 精品国产区一区二区三区在线观看| 亚洲香蕉成人av网站在线观看| 欧美日韩性视频在线| 色播久久人人爽人人爽人人片视av| 亚洲精品456在线播放狼人| 国产精品成人va在线观看| 一区二区三区久久精品| 国产成人精品久久二区二区| 欧美成年人视频| 亚洲欧洲一区二区三区在线观看| yellow中文字幕久久| 亚洲三级免费看| 欧美高清一级大片| 午夜精品一区二区三区av| 国产成人中文字幕| 夜夜狂射影院欧美极品| 精品美女国产在线| 成人美女免费网站视频| 亚洲欧洲在线播放| 午夜剧场成人观在线视频免费观看| 大桥未久av一区二区三区| 欧美成人午夜激情视频| 欧美另类极品videosbest最新版本| 亚洲国产美女久久久久| 亚洲精品一区二区久| 亚洲精品一区中文字幕乱码| 国产日韩欧美在线播放| 精品久久久久久久久久久久久| 色www亚洲国产张柏芝| 一区二区av在线| 欧美巨乳美女视频| 成人精品一区二区三区电影黑人| 欧美午夜精品久久久久久浪潮| 日韩精品久久久久久久玫瑰园| 国产乱肥老妇国产一区二| 国产日韩精品在线播放| 国产成人精品999| 日本精品一区二区三区在线播放视频| 亚洲最大福利网站| 亚洲精品电影在线观看| 亚洲精品欧美日韩| 国内成人精品视频| 欧美日韩成人在线播放| 国产免费一区二区三区在线能观看| 日本精品久久久久影院| 欧美成人精品影院| 久久九九全国免费精品观看| 国产精品老女人视频| 欧美老女人性视频| 91精品国产一区| 日韩免费看的电影电视剧大全| 91国语精品自产拍在线观看性色| 亚州成人av在线| 中文字幕av一区二区| 91视频国产高清| 777午夜精品福利在线观看| 日韩电影视频免费| 国产精品久久久久7777婷婷| 尤物yw午夜国产精品视频| 欧美激情精品久久久| 精品无人区太爽高潮在线播放| 韩剧1988在线观看免费完整版| 国产日产欧美a一级在线| 精品久久久久久国产91| 国产欧美一区二区三区在线| 日韩在线播放av| 久久精品国产91精品亚洲| 欧美床上激情在线观看| 亚洲一区中文字幕在线观看| 国产精品视频午夜| 色天天综合狠狠色| 午夜精品视频在线| 亚洲乱码av中文一区二区| 国内精品视频在线| 欧美激情2020午夜免费观看| 欧美人与性动交a欧美精品| 亚洲天堂成人在线视频| 裸体女人亚洲精品一区| 国产视频亚洲视频| 国产+人+亚洲| 久久99热精品这里久久精品| 亚洲欧洲日产国码av系列天堂| 中文字幕亚洲欧美在线| 欧美精品一区三区| 91亚洲精品久久久久久久久久久久| 国产精品视频最多的网站| 日韩成人网免费视频| 永久免费看mv网站入口亚洲| 欧美日韩国产一区在线| 欧美午夜精品久久久久久人妖| 久热国产精品视频| 97视频在线播放| 国产在线视频不卡| 国产午夜精品麻豆| 在线a欧美视频| 久久夜色精品国产亚洲aⅴ| 国产亚洲欧洲高清一区| 欧美xxxx14xxxxx性爽| 国产精品久久中文| 国产一区二区av| 久久久国产91| 欧美午夜精品在线| 欧美激情精品在线| 国产精品69久久| 亚洲精品中文字幕有码专区| 欧美成年人视频网站| 国产91露脸中文字幕在线| 久久精品成人一区二区三区| 日韩在线视频导航| 欧美日韩黄色大片| 国产亚洲精品久久久久动| 日韩国产中文字幕| 欧美理论片在线观看| 亚洲第一视频网| 日韩av一区二区在线观看| 亚洲18私人小影院| 成人免费看片视频| 日韩美女激情视频| 日韩中文字幕网| 亚洲天堂精品在线| 综合欧美国产视频二区| 亚洲第五色综合网| 欧美精品激情视频|