国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 文件系統(tǒng)完全指南

source / 1521人閱讀

摘要:同時,還封裝了常用目錄及文件操作的面向?qū)ο蠼涌诤偷鹘涌诜奖愦蠹沂褂梦募到y(tǒng)的元數(shù)據(jù)什么是元數(shù)據(jù)元數(shù)據(jù)通俗一點講就是數(shù)據(jù)的數(shù)據(jù)。

本文首發(fā)于個人博客 PHP 文件系統(tǒng)完全指南,轉(zhuǎn)載請注明出處。

今天我們將開啟一個新的探索旅程,深入到 PHP 文件系統(tǒng)中,系統(tǒng)的學(xué)習(xí)和掌握 PHP 文件系統(tǒng)的基本使用。

相信大家在日常研發(fā)過程中,難免需要和各種文件糾纏不清。比如,打開 .env 文件并從中讀取配置信息、把項目中的錯誤信息寫入到日志文件中或者獲取圖片的創(chuàng)建時間等等。在處理這些功能時,我們都需要使用到 PHP 文件系統(tǒng)接口。

下面是本文所涉主題的提綱:

一 什么是文件系統(tǒng)

二 深入 PHP 文件系統(tǒng)

三 面向?qū)ο蟮哪夸洷闅v

四 PHP 文件系統(tǒng)思維導(dǎo)圖

本文較長,耗時約 20 分鐘,請做好戰(zhàn)斗準(zhǔn)備!

一 什么是文件系統(tǒng)

開始之前,我們首先需要厘清我們所研究的問題領(lǐng)域,理解什么是文件系統(tǒng),還有我們所研究的對象。

在計算機中,文件系統(tǒng)(file system or filesystem)用于管理數(shù)據(jù)如何存儲和如何被獲取的。 - 維基百科

簡單來說,就是我們應(yīng)該如何管理我們的目錄(文件夾)和文件。通常,我們將具有相似屬性的文件,存儲到同一個目錄中以便后續(xù)查找,這個常見的操作就會涉及到目錄和文件。

對于軟件工程師來講,一個非常典型的使用場景,就是在開發(fā) MVC 項目時,將控制器、視圖和模型等模塊的文件,存儲到不同的目錄結(jié)構(gòu)中方便管理。

無論如何,我們依據(jù)不同特性劃分文件和目錄都是為了解決文件存儲和查找的問題。

有了這些認知后,應(yīng)該自然而然的想到我們當(dāng)前研究的 PHP 文件系統(tǒng)(或者說文件系統(tǒng))其所研究的對象,簡單概括起來就是:

目錄(文件夾)

文件

也就是說,本文我們所講解的 PHP 文件系統(tǒng)函數(shù)處理,基本都是圍繞目錄和文件展開的。

二 深入 PHP 文件系統(tǒng)

在 PHP 文件系統(tǒng)中內(nèi)置提供了超過 80 個可用的 文件系統(tǒng)函數(shù)。由于數(shù)量繁多功能強大,自然本文無法將對所有的系統(tǒng)函數(shù)逐一講解。一來,時間過于倉促;再者,短時間內(nèi)我們也沒有那么多的精力將它們?nèi)空莆铡?/p>

盡管如此,大家也不必氣餒,本文會將有限的時間和精力,來研究以下幾個在文件處理時的常見話題:

文件的元數(shù)據(jù)應(yīng)該如何獲取

文件的 MIME 類型如何獲取

文件和目錄的操作處理

文件和目錄的權(quán)限管理

另外,補充說明一點,PHP 標(biāo)準(zhǔn)函數(shù)庫不僅為我們提供了面向過程的文件系統(tǒng)處理函數(shù)。同時,還封裝了常用目錄及文件操作的面向?qū)ο蠼涌诤偷鹘涌诜奖愦蠹沂褂茫?/p>

SplFileInfo

finfo

DirectoryIterator

RecursiveDirectoryIterator

2.1 文件系統(tǒng)的元數(shù)據(jù) 2.1.1 什么是元數(shù)據(jù)

元數(shù)據(jù)(meta data):通俗一點講就是「數(shù)據(jù)的數(shù)據(jù)」。拿一個 php 文件來說它的元數(shù)據(jù)可以是 創(chuàng)建時間文件名文件大小文件所有權(quán)限 等,這類能夠表明該文件基本特征的數(shù)據(jù)就是「元數(shù)據(jù)(meta data)」了。

2.1.2 常用元數(shù)據(jù)獲取

在這一節(jié),我們將學(xué)習(xí)一些經(jīng)常需要獲取的文件元數(shù)據(jù)函數(shù),包括:

獲取文件的最后修改時間

獲取文件的上次訪問時間

獲取文件的路徑信息

獲取文件的絕對路徑

獲取文件類型

獲取文件大小

獲取文件權(quán)限

獲取文件所屬用戶及用戶組

話不多說,擼起袖子開干吧!

獲取文件的最后修改時間

要獲取文件的上次被修改時間戳,我們可以使用函數(shù) filemtime($filename) 或 SplFileInfo::getMTime() 方法。

注意 SplFileInfo 類實例化時接收 $filename 文件路徑作為參數(shù),后續(xù)沒有特別說明默認我們已經(jīng)獲取到了 SplFileInfo 實例才能進行 getMTime() 等類似處理。
// 文件路徑請求改成你自己的文件路徑
$filename = "f://filesystem/test.txt";

// 面向過程: 獲取文件時間
$modifyTimestamp = filemtime($filename);

// 面向?qū)ο?$file = new SplFileInfo($filename);
$modifyTimestamp = $file->getMTime();

2 獲取文件的上次訪問時間

可以使用函數(shù) fileatile($filename) 或 SplFileInfo::getATime() 方法,來獲取文件的最后被訪問時間戳。

// 文件路徑請求改成你自己的文件路徑
$filename = "f://filesystem/test.txt";

// 面向過程: 獲取文件時間
$accessTimestamp = fileatime($filename);

// 面向?qū)ο?$file = new SplFileInfo($filename);
$accessTimestamp = $file->getATime();

除了 filemtilefileatime 之外,還有 filectime 來獲取文件的 inode 修改時間(可認為是創(chuàng)建時間)。

有關(guān)時間的函數(shù)常用的就這些,為了方便記住,我們來看看它們是如何命名的:

2.1 面向過程 file 前綴,面向?qū)ο?get 前綴

2.2 a: access(訪問);m:modify(修改);c:create(創(chuàng)建)

2.3 time 后綴

2.4 fileatime,SplFileInfo::getATime;filemtime,SplFileInfo::getMTime;filectime,SplFileInfo::getCTime。

是不是很簡單呢!

注意,使用 filectime 時,對于 Windows 系統(tǒng)會獲取創(chuàng)建時間,但對于類 Unix 系統(tǒng)是修改時間,因為在類 Unix 系統(tǒng)中多數(shù)文件系統(tǒng)并沒有創(chuàng)建時間的概念。具體說明可以看 PHP: how can I get file creation date?。

3 獲取文件的路徑信息

除了時間這些元數(shù)據(jù),另一個經(jīng)常遇到的情況是獲取文件的路徑信息,包括:

3.1 目錄信息

獲取目錄信息我們可以使用 pathinfo($filename, PATHINFO_DIRNAME)dirname($filename)SplFileInfo::getPath()

比如下面給出的文件:

$filename = "F:Program FilesSSH Communications SecuritySSH Secure ShellOutput.txt";

將會獲取到 F:Program FilesSSH Communications SecuritySSH Secure Shell 這部分目錄信息。

3.2 文件名信息

這里我們所有的文件名指的是不帶擴展名后綴的文件名稱,比如需要獲取 your_path/filename.txt 中的 filename 部分。

需要取得文件名信息,我們可以使用 pathinfo($filename, PATHINFO_FILENAME)basename($filename, $suffix)SplFileInfo::getBasename($suffix) 獲取。

這里給出的 $suffix** 指不獲取 **$suffix 擴展名部分(比如不獲取 $suffix = ".txt")。

請看下面的示例:

$filename = "F:Program FilesSSH Communications SecuritySSH Secure ShellOutput.txt";

將會獲取到 Output 這部分文件名信息。

3.3 擴展名信息

擴展名我們可以使用 pathinfo($filename, PATHINFO_EXTENSION)SplFileInfo::getExtension() 方法拿到。

基于前面的了解,我們可以獲取到 txt 這部分?jǐn)U展信息,這里不再贅述。

3.4 basename(文件名 + 擴展名)信息

basename 指的是 文件名 + 擴展名 內(nèi)容信息,可以使用 pathinfo($filename, PATHINFO_BASENAME)basename($filename)SplFileInfo::getBasename()SplFileInfo::getFilename() 方法拿到。

雖然這里我們列出了很多的函數(shù),但是基本上還是比較容易理解的,需要注意的是:

pathinfo 可以獲取所有文件相關(guān)的路徑信息,如果指定第二個參數(shù)選項將僅獲取該部分的信息

文件名和 basename 不是特別容易理解,你可以使用完全相同的方法或函數(shù) basenameSplFileInfo::getBasename() 獲取他們,區(qū)別在于是否摘除指定的 $suffix 后綴。

3.5 示例

getPath();

echo "--- directory begin: ---" . PHP_EOL;
echo $directory1 . PHP_EOL, $directory2 . PHP_EOL, $directory3 . PHP_EOL;

// 文件名
$suffix = ".txt";
$filename1 = pathinfo($filename, PATHINFO_FILENAME);
$filename2 = basename($filename, $suffix);
$filename3 = $file->getBasename($suffix);

echo "--- filename begin: ---" . PHP_EOL;
echo $filename1 . PHP_EOL, $filename2 . PHP_EOL, $filename3 . PHP_EOL;

// 擴展名
$extension1 = pathinfo($filename, PATHINFO_EXTENSION);
$extension2 = $file->getExtension();

echo "--- extension begin: ---" . PHP_EOL;
echo $extension1 . PHP_EOL, $extension2 . PHP_EOL;

// basename = 文件名 + 擴展名
$basename1 = pathinfo($filename, PATHINFO_BASENAME);
$basename2 = basename($filename);
$basename3 = $file->getBasename();
$basename4 = $file->getFilename();

echo "--- basename begin: ---" . PHP_EOL;
echo $basename1 . PHP_EOL, $basename2 . PHP_EOL, $basename3 . PHP_EOL, $basename4 . PHP_EOL;

它們的運行結(jié)果如下:

--- directory begin: ---
F:Program FilesSSH Communications SecuritySSH Secure Shell
F:Program FilesSSH Communications SecuritySSH Secure Shell
F:Program FilesSSH Communications SecuritySSH Secure Shell
--- filename begin: ---
Output
Output
Output
--- extension begin: ---
txt
txt
--- basename begin: ---
Output.txt
Output.txt
Output.txt
Output.txt

3.6 文件路徑信息關(guān)系圖

另外需要注意的一點是在使用 SplFileInfo 獲取 basename 時,getBasename() 和 getFilename() 返回基本一致,但是在處理根目錄下的文件名獲取時表現(xiàn)稍有不同。
這里可以到官方文檔中用戶 提交的反饋 去詳細了解一下。

4 獲取文件的絕對路徑

絕對路徑由 realpath($path)SplFileInfo::getRealpath() 獲取。

5 獲取文件類型

可以使用 filetype($filename)SplFileInfo::getType() 來獲取文件的類型。

返回值范圍:

dir

file

char

fifo

block

link

unknown

可以查看 Linux 文件類型與擴展名 相關(guān)文件類型,這里我們重點關(guān)注下 dir 目錄和 file 普通文件類型即可。

6 獲取文件大小

可以使用 filesize($filename)SplFileInfo::getSize() 來獲取文件的大小,不再贅述。

7 獲取文件權(quán)限

可以使用 fileperms($filename)SplFileInfo::getPerms() 來獲取到文件的所屬權(quán)限。

值得注意的是它們的返回值是十進制表示的權(quán)限,如果需要獲取類似 0655 八進制權(quán)限表示法,我們需要對返回值進行處處理才行:

// @see  http://php.net/manual/zh/function.fileperms.php#refsect1-function.fileperms-examples
$permissions = substr(sprintf("%o", fileperms($filename)), -4);

你可以通過 PHP: fileperms() values and convert these 了解更多關(guān)于 PHP 獲取文件權(quán)限轉(zhuǎn)換的更多細節(jié)。

基本上學(xué)習(xí)完這些文件元數(shù)據(jù)信息獲取方法,差不多可以應(yīng)對日常開發(fā)過程中的多數(shù)應(yīng)用場景,盡管如此,還是建議仔細去閱讀官方 文件系統(tǒng)函數(shù),那里才是知識的源泉。

掌握文件的元數(shù)據(jù),對我們了解文件的特性大有裨益,就好比兩個人談戀愛,懂得彼此才是最好的狀態(tài)。

2.2 文件系統(tǒng)操作

可以說我們?nèi)粘T谔幚砦募倪^程中,更多的是在操作文件或者目錄(文件夾),本節(jié)我們將學(xué)習(xí)文件系統(tǒng)操作相關(guān)知識。

依據(jù)文件類型的不同我們可以簡單的將操作分為:

對目錄(dir)的操作

和對普通文件(file)的操作

2.2.1 目錄操作使用場景

在處理目錄時我們一般涉及如下處理:

創(chuàng)建目錄

刪除目錄

打開目錄

讀取目錄

關(guān)閉目錄句柄

場景一

我們有一套 CMS 管理系統(tǒng)支持文件上傳處理,當(dāng)目錄不存在時依據(jù)文件上傳時間,動態(tài)的創(chuàng)建文件存儲目錄,比如,我們依據(jù) 年/月/日(2018/01/01) 格式創(chuàng)建目錄。這里就涉及到 目錄創(chuàng)建 的處理。

場景二

當(dāng)然,文件上傳完成了還不夠,我們還需要讀取各個目錄下的所有文件。這里涉及 打開目錄讀取目錄 以及讀取完成后 關(guān)閉目錄句柄

有了相關(guān)概念和思路后,我們具體看看究竟 PHP 文件系統(tǒng)給我們提供了哪些方便處理目錄的函數(shù)呢?

2.2.1.1 創(chuàng)建目錄

在 PHP 文件系統(tǒng)擴展中同樣給我們提供了處理 目錄結(jié)構(gòu)的系統(tǒng)函數(shù)。

其中創(chuàng)建一個新目錄需要使用 [mkdir($pathname [, $mode = 0777, $recursive = false])](http://php.net/manual/zh/func... 函數(shù)。

$pathname 參數(shù)為待創(chuàng)建目錄的路徑

$mode 為創(chuàng)建目錄時的訪問權(quán)限,0777 意味著獲取最大訪問權(quán)限

$recursive 用于標(biāo)識是否遞歸創(chuàng)建目錄,默認 false 不會遞歸創(chuàng)建

請看一個示例:

$pathname = "/path/to/your/upload/file/2018/01/01";
$created = mkdir($pathname);

創(chuàng)建目錄是不是特別的簡單呢?

但是等等,我們在類 Unix 系統(tǒng)中滿心歡喜的使用 mkdir 并采用 $mode=0777 權(quán)限來創(chuàng)建一個全新的目錄,但為什么當(dāng)我們進入到目錄中看到的目錄的權(quán)限卻是 0755 呢?

umask 掩碼

這里涉及到 umask 掩碼的問題!

重點: 原來我們在類 Unix 系統(tǒng)中創(chuàng)建新目錄是給出的權(quán)限會默認減去當(dāng)前系統(tǒng)的 umask 值,才是實際創(chuàng)建目錄時的所屬權(quán)限。

什么意思呢?

比如:

// 我們期望創(chuàng)建的文件權(quán)限
$mode = 0777;

// 當(dāng)前系統(tǒng)中 umask 值
$umask = 0022;// 可以由 umask 命令查看當(dāng)前系統(tǒng) umask 值,默認是 0022

// 實際創(chuàng)建的文件權(quán)限
  0777
- 0022
------
= 0755

現(xiàn)在我們來對之前的實例稍作修改,看看 PHP 如何創(chuàng)建目錄時得到希望的系統(tǒng)權(quán)限吧:

$pathname = "/path/to/your/upload/file/2018/01/01";

// 將系統(tǒng) umask 設(shè)置為 0,并取得當(dāng)前 umask 值(比如默認 0022)
$umask = umask(0);
$created = mkdir($pathname, $mode = 0777);
// 將系統(tǒng) umask 設(shè)置回原值
umask($umask);

有關(guān) umask 函數(shù)說明可以查看官方手冊。另外可以查看 Why can"t PHP create a directory with 777 permissions? 這個問答了解更多細節(jié)。

2.2.1.2 目錄遍歷

面向過程的目錄遍歷提供兩種解決方案:

通過 opendir、readdir 和 closedir 來遍歷目錄;

另一種是直接使用 scandir 遍歷指定路徑中的文件和目錄。

目錄遍歷示例一,出自 官方文檔:

目錄遍歷示例二,出自 官方文檔:

 .
//     [1] => ..
//     [2] => bar.php
//     [3] => foo.txt
//     [4] => somedir
// )

目錄的操作處理大致就是在處理這兩類問題,相比于普通文件的處理來講簡單很多,下一節(jié)我們會學(xué)習(xí)有關(guān)普通文件的處理,請大家做好戰(zhàn)斗準(zhǔn)備。

2.2.2 文件操作使用場景

可以說我們在處理文件系統(tǒng)時,絕大多數(shù)都是在處理一個普通文件,那么我們在操作文件時,我們究竟在做什么呢?

你可能已經(jīng)想到了,沒錯我們多數(shù)時候就是在處理如下文件問題:

創(chuàng)建一個新的空文件

打開一個文件句柄,以供后續(xù)讀取或?qū)懭?/p>

將文件中的內(nèi)容覆蓋掉(覆蓋寫入),或者在文件末尾寫入新的內(nèi)容(追加寫入)

讀取文件的內(nèi)容

刪除文件

復(fù)制文件

關(guān)閉文件句柄

文件的讀取和寫入相對會復(fù)雜一些,所以這兩部分的內(nèi)容會在稍后詳細講解。先讓我們看看其它幾個常見文件處理。

2.2.2.1 創(chuàng)建空文件

創(chuàng)建空文件有兩種方式:
一是:以寫入(w)模式使用 fopen($filename, $mode = "wb") 打開一個文件,當(dāng)文件不存在時則會創(chuàng)建一個新文件;
二是:使用 touch 函數(shù)創(chuàng)建一個新文件。

這兩個函數(shù)同其它文件系統(tǒng)函數(shù)使用大致相同,感興趣的朋友可以閱讀手冊,這里不作展開。

2.2.2.2 刪除文件

刪除文件由 unlink($filename) 函數(shù)完成。

2.2.2.3 復(fù)制文件

復(fù)制文件由 copy($source, $dest) 函數(shù)完成,會將 $source 文件拷貝到 $dest 文件中。

如果需要移動文件(重命名)可以使用 rename($oldname, $newname) 完成這個處理。

以上都是相對簡單的文件處理函數(shù)就不一一舉例說明了。

接下來學(xué)習(xí)如何讀取文件中的內(nèi)容。依據(jù)二八原則,可以說我們百分之八十的時間都在處理文件寫入和讀取的處理,所以我們有必要理清如何對文件進行讀取和寫入。

2.2.2.4 讀取文件

讀取文件的標(biāo)準(zhǔn)流程是:

打開一個文件句柄;

使用文件讀取函數(shù)讀取文件;

判斷是否到文件結(jié)尾,到結(jié)尾則結(jié)束讀取,否則回到操作 2;

讀取完成關(guān)閉句柄;

開始之前我們需要準(zhǔn)備一個有數(shù)據(jù)的文件,比如 F:php_workspacephp-code-kata ead.txt,在看一個簡單的文件讀取示例:


現(xiàn)在,我們來詳細講解一下上述代碼做了什么處理吧:

使用 fopen($filename, $mode) 打開一個文件或 URL 句柄,供后續(xù)文件系統(tǒng)函數(shù)使用;

使用 fgetc($handle) 函數(shù)從文件句柄中讀取一個字符;

使用 feof($handle) 判斷文件句柄是否到文件的結(jié)尾處,否則繼續(xù)讀取文件;

當(dāng)讀取完成后使用 fclose($handle) 關(guān)閉打開的文件句柄,完成文件讀取的所有操作。

總體來說,在讀取文件時按照以上處理流程,基本上太容易出錯的。不過即便如此,還是有些重點需要我們小心處理:

我們以什么模式打開一個文件句柄,示例中使用 $mode="rb" r(read) 只讀模式開個一個文件句柄(只讀模式下不能對文件盡心寫入)。另外還有幾個常用模式可供使用:

r+ 讀寫模式

w(write) 覆蓋寫入

w+ 覆蓋讀寫

a(append) 追加寫入

a+ 追加讀寫

b 重點關(guān)注此模式,為增強項目可移植和健壯性,推薦所有模式添加「b」模式強制使用二進制模式

有關(guān)所有可用模式的說明可以從 模式 手冊中查找。

在執(zhí)行文件內(nèi)容讀取時除了逐字符讀取(fgetc),要支持一下集中讀取形式:

fgets($handle) 每次讀取一行數(shù)據(jù)

fgetss($handle) 每次讀取一行數(shù)據(jù),并過來 HTML 標(biāo)記

fgetcsv($handle) 讀取 CSV 文件,每次讀取一樣并解析字段

fread($handle, $length) 每次從句柄中最多讀取 $length 個字節(jié)。

處理可以從句柄中讀取文件數(shù)據(jù),PHP 還提供將整個文件讀取的方法:

file($filename) 把整個文件讀入一個數(shù)組中

file_get_contents($filename) 將整個文件讀入一個字符串

注意: 讀取文件操作時我們推薦使用 file_get_contents

到這里我們基本上就涵蓋了文件讀取的所有知識點,相信大家對文件讀取已經(jīng)有了一個比較系統(tǒng)的認知。

下面我們進入到文件寫入處理中,看看文件寫入的正確姿勢。

2.2.2.5 讀取寫入

典型的文件寫入流程基本上和文件讀取流程一致:

打開一個文件句柄;

使用文件讀取函數(shù)向文件中寫入內(nèi)容;

寫入完成關(guān)閉句柄。

依據(jù)慣例我們來看一個簡單的示例:


注意:這里我們以追加寫入的模式  $mode = "ab" 寫入文件內(nèi)容。

文件寫入就如同文件讀取一樣的簡單,相信大家能夠輕松掌握這方面的知識。然而,我們顯示世界可能充滿了荊棘,稍不留神可能就會深陷泥沼。比如:

我在寫入文件時,同時其他人也在對同一個文件進行寫入,怎么辦?我們可以使用 flock($handle, LOCK_EX) 加鎖函數(shù)進行獨占寫入。

每次都需要 打開文件寫入再關(guān)閉 是在麻煩!有沒有更簡單的方式寫文件呢?PHP 同樣為你考慮到了這點,所以提供了 [file_put_contents($filename, $data [, LOCK_EX])](http://php.net/manual/zh/func... 將一個字符串寫入文件,同樣的它也支持獨占寫入。

到這里,我們基本上就學(xué)習(xí)完 PHP 文件系統(tǒng)中大多數(shù)常用的函數(shù)了。然而就如我所說的那樣,現(xiàn)實世界總是殘酷的。尤其是在讀寫文件時,經(jīng)常會遇到各種各樣的錯誤,我們應(yīng)該如何才能避免呢?

嗯,PHP 一樣為我們內(nèi)置了檢測文件有效性的函數(shù),規(guī)避各種錯誤。

2.2.2.5 如何處理文件權(quán)限及檢測有效性

文件有效性檢測

檢測文件的有效性能夠讓我們規(guī)避常見的開發(fā)錯誤,比如:

當(dāng)相文件中寫入數(shù)據(jù)時,是不是需要檢測它有可寫的權(quán)限,并且它是不是一個文件而非文件夾?

讀取文件內(nèi)容時,是不是需要查看下我們能不能對其進行讀取?

在安裝項目時,我們是不是需要檢測已經(jīng)依據(jù)實例配置文件創(chuàng)建了實際的配置文件呢?

這些內(nèi)容都需要使用到文件有效性檢測相關(guān)知識。

判斷文件是否可寫我們有:is_writable($filename) 和 SplFileInfo::isWritable()

路徑目錄判斷:is_dir($filename) 和 SplFileInfo::isDir();文件判斷:is_file($filename) 和 **SplFileInfo::isFile()。

檢測文件或目錄是否已經(jīng)創(chuàng)建過,我們使用 file_exists($filename) 函數(shù)完成。

如何修改文件權(quán)限

當(dāng)我們能夠正確的檢測文件是否存在時,我們還需要面對的問題時,如果我們的文件當(dāng)前用戶 不可寫入,我們應(yīng)該如何修改權(quán)限使其可寫呢?

這里就涉及修改文件權(quán)限操作,之前我們在創(chuàng)建目錄是已經(jīng)接觸過 umask 掩碼相關(guān)知識。這里我們將講解那些已經(jīng)創(chuàng)建的文件權(quán)限變更的方法。

通常,我們會使用 chmod($filename, $mode) 去修改一個文件的權(quán)限。

另外,還可以關(guān)注以下幾個權(quán)限相關(guān)的處理函數(shù):

chgrp($filename, $group) 改變文件所屬的組

chown($filename, $user) 改變文件的所有者

以及,之前提到過的 umask 修改掩碼函數(shù)。

文章進行到這里,其實基本上 PHP 文件系統(tǒng)的所有知識都已經(jīng)涉及到了。那么,下回見吧?不不不...

為了應(yīng)對實戰(zhàn)(面試需要),我們可能需要進一步對目錄遍歷做更進一步的研究。還記得我們之前使用過 scandir 來遍歷指定路徑中的文件和目錄夾么?

現(xiàn)在我們將使用面向?qū)ο蟮慕涌趤碇匦聦崿F(xiàn)一個權(quán)限的目錄遍歷處理。

3 面向?qū)ο蟮哪夸洷闅v

使用面向?qū)ο蟮慕涌趤肀闅v目錄,是一個非常有意義的教程,這里我們所涉及使用的接口包括:

DirectoryIterator 創(chuàng)建非遞歸的目錄迭代器

RecursiveDirectoryIterator 創(chuàng)建遞歸的目錄迭代器

RecursiveIteratorIterator 創(chuàng)建一個遞歸迭代器的迭代器(用于迭代獲取 RecursiveIteratorIterator 示例)

話不多說,我們看下如何創(chuàng)建一個功能強大的支持遞歸迭代的目錄迭代程序:

/**
 * 目錄掃描
 * 
 * @method listContents($path, $recursive = false) 獲取目錄中所有文件及文件夾
 */
class DirectoryScanner 
{

    /**
     * 獲取目錄中所有文件及文件夾
     * 
     * @param $path      目錄
     * @param $recursive 遞歸獲取
     * 
     * @return array
     */
    public static function listContents($path, $recursive = false)
    {
        $iter = $recursive ? static::getRecursiveDirectoryIterator($path) : static::getDirectoryIterator($path);

        $result = [];
        foreach ($iter as $file) {
            if (in_array($file->getFilename(), [".", ".."])) {
                continue;
            }

            $result[] = clone $file;
        }

        return $result;
    }

    /**
     * 獲取目錄迭代器
     * 
     * @param $path      目錄
     * 
     * @return DirectoryIterator::class
     */
    public static function getDirectoryIterator($path)
    {
        return new DirectoryIterator($path);
    }

    /**
     * 獲取遞歸目錄迭代器
     * 
     * @param $path      目錄
     * @param $mode      遍歷模式: RecursiveIteratorIterator::SELF_FIRST 從當(dāng)前目錄開始遍歷;RecursiveIteratorIterator::CHILD_FIRST 從子目錄開始遍歷
     * 
     * @return RecursiveIteratorIterator::class
     */
    public static function getRecursiveDirectoryIterator($path, $mode = RecursiveIteratorIterator::SELF_FIRST )
    {
        return new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
            $mode
        );
    }
}

$path = "F:php_workspacephp-code-katadirecotry-iteratordir";

var_dump(DirectoryScanner::listContents($path));
var_dump(DirectoryScanner::listContents($path, true));
4 PHP 文件系統(tǒng)思維導(dǎo)圖

文件系統(tǒng)思維導(dǎo)圖

5 擴展閱讀

文件系統(tǒng)函數(shù)

DirectoryIterator 迭代器

RecursiveDirectoryIterator 迭代器

RecursiveIteratorIterator 迭代器

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29088.html

相關(guān)文章

  • 【開源免費】接口管理平臺 eoLinker V3.1.7發(fā)布+開源版部署指南一份

    摘要:開源版更新日志新增更加開放的開源態(tài)度,開源項目協(xié)議從更改為。為了防止數(shù)據(jù)丟失,請在執(zhí)行任何關(guān)鍵操作之前妥善備份數(shù)據(jù)庫。開源版的使用操作與線上免費版基本同步,如有任何使用的問題請參考線上版操作指南。更多更全的教程和內(nèi)容盡在中文網(wǎng)址 showImg(https://segmentfault.com/img/remote/1460000012443951?w=750&h=410); eoLi...

    tuantuan 評論0 收藏0
  • 服務(wù)器安全基礎(chǔ)指南

    摘要:安裝打開配置文件,進行配置寫入到這里,就是我個人從上次被黑當(dāng)中總結(jié)的一些基本的服務(wù)器安全,而至于群里大神說的跳板機的方案,容我再消化消化再嘗試部署起來。總結(jié)服務(wù)一些基本的安全配置得跟上。服務(wù)器一旦被入侵,不急。 首先,VPS 服務(wù)器被黑怎么辦? 第一, 10秒之內(nèi)登錄你的 VPS 提供商賬號,關(guān)機。第二,切斷被黑機器的外網(wǎng)。第三,在相同的 VPS 提供商重開一臺機器,內(nèi)網(wǎng)登錄,備份重要...

    godiscoder 評論0 收藏0
  • 成為一個PHP專家:缺失的環(huán)節(jié)

    摘要:為了成為一個專家,他必須先成為中級者。它非常適合于急于求成或者沒有太多技術(shù)的人,但掌握絕對無法使你成為一個專業(yè)的開發(fā)者它使用意大利面條式的編碼,教你的是不合適的設(shè)計原則。 這一篇文章是Becoming a PHP Professional系列 4 篇博文中的第 1 篇。 當(dāng)瀏覽各類與PHP相關(guān)的博客時,比如Quora上的問題,谷歌群組,簡訊和雜志,我經(jīng)常注意到技能的等級分化。問題都類...

    cooxer 評論0 收藏0
  • drupal8 用戶指南

    摘要:一句話概括官方文檔概念是個內(nèi)容管理系統(tǒng)哦那么,什么是內(nèi)容管理系統(tǒng)就是用戶自己編輯自己的網(wǎng)站內(nèi)容的一個系統(tǒng)。要求,其他的隨意。狀態(tài)類型關(guān)于你站點的當(dāng)前狀態(tài)的臨時性的數(shù)據(jù)信息。比如你的計劃執(zhí)行任務(wù)的最后一次執(zhí)行時間。 一句話概括 - 官方文檔 概念- Drupal是個內(nèi)容管理系統(tǒng)哦 那么,什么是內(nèi)容管理系統(tǒng)?就是用戶自己編輯自己的網(wǎng)站內(nèi)容的一個系統(tǒng)。 那么,什么是Drupal呢?Dru...

    kel 評論0 收藏0
  • 1月份前端資源分享

    摘要:更多資源請文章轉(zhuǎn)自月份前端資源分享視頻前端技術(shù)論壇融合不可錯過的迷你庫測試框架實例教程為你詳細解讀請求頭的具體含意解析的庫如果要用前端框架,開發(fā)流程是怎樣的與有什么區(qū)別正確使用的方法是什么流程圖插件小如何讓元素只能輸入純文本前端技術(shù)中 更多資源請Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront...

    solocoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<