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

首頁 > 編程 > PHP > 正文

PHP文件系統(tǒng)的詳細(xì)介紹

2020-03-22 20:22:57
字體:
供稿:網(wǎng)友
這篇文章給大家介紹的內(nèi)容是關(guān)于PHP文件系統(tǒng)的詳細(xì)介紹,有著一定的參考價(jià)值,有需要的朋友可以參考一下。

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

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

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

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

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

html' target='_blank'>面向?qū)ο?/u>的目錄遍歷

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

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

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

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

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

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

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

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

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

目錄(文件夾)

文件

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

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

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

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

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

文件的 MIME 類型如何獲取

文件和目錄的操作處理

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

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

SplFileInfo

finfo

DirectoryIterator

RecursiveDirectoryIterator

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

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

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

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

獲取文件的最后修改時(shí)間

獲取文件的上次訪問時(shí)間

獲取文件的路徑信息

獲取文件的絕對(duì)路徑

獲取文件類型

獲取文件大小

獲取文件權(quán)限

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

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


獲取文件的最后修改時(shí)間

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

注意 SplFileInfo 類實(shí)例化時(shí)接收 $filename 文件路徑作為參數(shù),后續(xù)沒有特別說明默認(rèn)我們已經(jīng)獲取到了 SplFileInfo 實(shí)例才能進(jìn)行 getMTime() 等類似處理。
// 文件路徑請(qǐng)求改成你自己的文件路徑$filename = f://filesystem/test.txt // 面向過程: 獲取文件時(shí)間$modifyTimestamp = filemtime($filename);// 面向?qū)ο?file = new SplFileInfo($filename);$modifyTimestamp = $file- getMTime();

2 獲取文件的上次訪問時(shí)間

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

// 文件路徑請(qǐng)求改成你自己的文件路徑$filename = f://filesystem/test.txt // 面向過程: 獲取文件時(shí)間$accessTimestamp = fileatime($filename);// 面向?qū)ο?file = new SplFileInfo($filename);$accessTimestamp = $file- getATime();

除了 filemtile 和 fileatime 之外,還有 filectime 來獲取文件的 inode 修改時(shí)間(可認(rèn)為是創(chuàng)建時(shí)間)。

有關(guān)時(shí)間的函數(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 時(shí),對(duì)于 Windows 系統(tǒng)會(huì)獲取創(chuàng)建時(shí)間,但對(duì)于類 Unix 系統(tǒng)是修改時(shí)間,因?yàn)樵陬?Unix 系統(tǒng)中多數(shù)文件系統(tǒng)并沒有創(chuàng)建時(shí)間的概念。具體說明可以看 PHP: how can I get file creation date?。

3 獲取文件的路徑信息

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

3.1 目錄信息

獲取目錄信息我們可以使用 pathinfo($filename, PATHINFO_DIRNAME)](http://php.net/manual/zh/function.pathinfo.php)**、**[dirname($filename) 和 SplFileInfo::getPath()

比如下面給出的文件:

$filename = F:/Program Files/SSH Communications Security/SSH Secure Shell/Output.txt 

將會(huì)獲取到 F:/Program Files/SSH Communications Security/SSH Secure Shell 這部分目錄信息。

3.2 文件名信息

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

需要取得文件名信息,我們可以使用 pathinfo($filename, PATHINFO_FILENAME)](http://php.net/manual/zh/function.pathinfo.php)**、**[basename($filename, $suffix)](http://php.net/manual/zh/function.basename.php)** 和 **[SplFileInfo::getBasename($suffix) 獲取。

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

請(qǐng)看下面的示例:

$filename = F:/Program Files/SSH Communications Security/SSH Secure Shell/Output.txt 

將會(huì)獲取到 Output 這部分文件名信息。

3.3 擴(kuò)展名信息

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

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

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

basename 指的是 文件名 + 擴(kuò)展名 內(nèi)容信息,可以使用 pathinfo($filename, PATHINFO_BASENAME)](http://php.net/manual/zh/function.pathinfo.php)**、 **[basename($filename)、SplFileInfo::getBasename() 和 SplFileInfo::getFilename() 方法拿到。

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

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

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

3.5 示例

 ?php$filename = F:/Program Files/SSH Communications Security/SSH Secure Shell/Output.txt 
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;// 擴(kuò)展名$extension1 = pathinfo($filename, PATHINFO_EXTENSION);$extension2 = $file- getExtension();echo --- extension begin: --- . PHP_EOL;echo $extension1 . PHP_EOL, $extension2 . PHP_EOL;// basename = 文件名 + 擴(kuò)展名$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;

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

--- directory begin: ---F:/Program Files/SSH Communications Security/SSH Secure ShellF:/Program Files/SSH Communications Security/SSH Secure ShellF:/Program Files/SSH Communications Security/SSH Secure Shell--- filename begin: ---OutputOutputOutput--- extension begin: ------ basename begin: ---Output.txtOutput.txtOutput.txtOutput.txt

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

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

4 獲取文件的絕對(duì)路徑

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

5 獲取文件類型

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

返回值范圍:

dir

file

char

fifo

block

link

unknown

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

6 獲取文件大小

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

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

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

值得注意的是它們的返回值是十進(jìn)制表示的權(quán)限,如果需要獲取類似 0655 八進(jìn)制權(quán)限表示法,我們需要對(duì)返回值進(jì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)換的更多細(xì)節(jié)。

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

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

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

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

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

對(duì)目錄(dir)的操作

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

2.2.1 目錄操作使用場景

在處理目錄時(shí)我們一般涉及如下處理:

創(chuàng)建目錄

刪除目錄

打開目錄

讀取目錄

關(guān)閉目錄句柄

場景一

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

場景二

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

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

2.2.1.1 創(chuàng)建目錄

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

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

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

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

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

請(qǐng)看一個(gè)示例:

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

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

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

umask 掩碼

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

重點(diǎn): 原來我們?cè)陬?Unix 系統(tǒng)中創(chuàng)建新目錄是給出的權(quán)限會(huì)默認(rèn)減去當(dāng)前系統(tǒng)的 umask 值,才是實(shí)際創(chuàng)建目錄時(shí)的所屬權(quán)限。

什么意思呢?

比如:

// 我們期望創(chuàng)建的文件權(quán)限$mode = 0777;// 當(dāng)前系統(tǒng)中 umask 值$umask = 0022;// 可以由 umask 命令查看當(dāng)前系統(tǒng) umask 值,默認(rèn)是 0022// 實(shí)際創(chuàng)建的文件權(quán)限 0777- 0022------= 0755

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

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

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

2.2.1.2 目錄遍歷

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

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

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

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

 ?php$dir = /etc/php5/ // Open a known directory, and proceed to read its contentsif (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo filename: $file : filetype: . filetype($dir . $file) . /n  closedir($dh);// 輸出結(jié)構(gòu)類似于:// filename: . : filetype: dir// filename: .. : filetype: dir// filename: apache : filetype: dir// filename: cgi : filetype: dir// filename: cli : filetype: dir? 

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

 ?php$dir = /tmp $files1 = scandir($dir);print_r($files1);// 輸出結(jié)構(gòu)類似于:// Array// [0] = .// [1] = ..// [2] = bar.php// [3] = foo.txt// [4] = somedir// )

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

2.2.2 文件操作使用場景

可以說我們?cè)谔幚砦募到y(tǒng)時(shí),絕大多數(shù)都是在處理一個(gè)普通文件,那么我們?cè)诓僮魑募r(shí),我們究竟在做什么呢?

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

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

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

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

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

刪除文件

復(fù)制文件

關(guān)閉文件句柄

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

2.2.2.1 創(chuàng)建空文件

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

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

2.2.2.2 刪除文件

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

2.2.2.3 復(fù)制文件

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

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

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

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

2.2.2.4 讀取文件

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

打開一個(gè)文件句柄;

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

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

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

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

 ?php// 這里為了貼合讀取文件的標(biāo)準(zhǔn)流程,使用 do{} while 語句,你也可以修改成 while 語句。
// 讀取顯示大致類似:// hello world!

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

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

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

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

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

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

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

r+ 讀寫模式

w(write) 覆蓋寫入

w+ 覆蓋讀寫

a(append) 追加寫入

a+ 追加讀寫

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

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

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

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

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

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

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

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

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

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

注意: 讀取文件操作時(shí)我們推薦使用 file_get_contents。

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

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

2.2.2.5 讀取寫入

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

打開一個(gè)文件句柄;

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

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

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

 ?php$filename = F://php_workspace//php-code-kata//read.txt // 1. 打開一個(gè)文件句柄;$handle = fopen($filename, $mode = ab // 2. 使用文件讀取函數(shù)向文件中寫入內(nèi)容fwrite($handle, hello filesystem to write!/n // 3. 寫入完成關(guān)閉句柄;fclose($handle);
注意:這里我們以追加寫入的模式 $mode = ab 寫入文件內(nèi)容。

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

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

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

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

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

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

文件有效性檢測

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

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

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

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

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

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

路徑目錄判斷:is_dir($filename)](http://php.net/manual/zh/function.is-dir.php) 和 **[SplFileInfo::isDir()](http://php.net/manual/zh/splfileinfo.isdir.php)**;文件判斷:[is_file($filename) 和 **SplFileInfo::isFile()。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

話不多說,我們看下如何創(chuàng)建一個(gè)功能強(qiá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_workspace/php-code-kata/direcotry-iterator/dir var_dump(DirectoryScanner::listContents($path));var_dump(DirectoryScanner::listContents($path, true));
4 PHP 文件系統(tǒng)思維導(dǎo)圖

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

相關(guān)推薦:

php中導(dǎo)出大量數(shù)據(jù)的實(shí)現(xiàn)方法

PHP如何使用某個(gè)鍵值對(duì)二維數(shù)組排序

PHP開發(fā)中redis的主從模式以及加密方法

以上就是PHP文件系統(tǒng)的詳細(xì)介紹的詳細(xì)內(nèi)容,PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
香蕉国产在线视频| 成人免费在线视频播放| 亚洲高清毛片一区二区| 韩国福利视频一区| 91九色在线播放| 国产精品一区二区三区不卡| 日韩成人午夜电影| 亚洲电影一级片| 日韩a级黄色片| 国产欧美欧美| 可以在线看的av网站| 国产成人精品影视| 性xxxx欧美老肥妇牲乱| 免费毛片一区二区三区| 国产精品午夜在线| 影音av资源网| www.91在线观看| 色综合伊人色综合网| 国模套图日韩精品一区二区| 日本不卡一二三| 国产精品久久久久久亚洲影视| 苍井空张开腿实干12次| 国产一级做a爱片久久毛片a| 久久精品视频国产| 国产精品酒店视频| 一区二区三区在线观看网站| 国产精品永久免费在线| 性一交一乱一伧老太| 一区二区三区日韩在线观看| 免费看一级视频| 日日操免费视频| 欧美一区国产二区| 精品成人av一区二区在线播放| 亚洲影视一区二区| 国产精品综合久久久久久| 免费国产羞羞网站视频| 欧美亚洲图片小说| 免费在线观看一区二区| 欧美在线免费看视频| 黄色av免费| 国产精品免费视频一区二区| 午夜在线电影亚洲一区| 成人黄色一级大片| 性一交一乱一透一a级| 国产一区二区在线免费视频| 中国jizz妇女jizz妇女| 亚洲毛片在线免费观看| 亚洲1区在线观看| 亚洲一区二区三区美女| 久久亚洲二区三区| 国产一区二区视频免费在线观看| www.先锋影音av| 91tv亚洲精品香蕉国产一区| 综合亚洲深深色噜噜狠狠网站| 欧美三级日韩三级| 亚洲欧美日韩综合在线| a级日韩大片| 国产精品成人一区二区不卡| 在线免费观看h视频| 亚洲天堂狠狠干| 欧美美女一区二区| 日韩一区二区三区电影在线观看| 狠狠色丁香婷综合久久| 人人澡人人爽人人揉| 成人中文字幕视频| 青青久在线视频免费观看| 日韩精品一区二区三区四区五区| 中文精品视频| 狠狠色伊人亚洲综合网站l| 国产xxx在线观看| 欧美色图自拍| 国产亚洲精品熟女国产成人| 五月天在线免费视频| 一本久道久久综合狠狠爱| 色综合色狠狠综合色| 日韩精品影院| 91丨porny丨首页| 91一区二区三区四区| 拔插拔插华人永久免费| 日本不良网站在线观看| 一区二区三区不卡在线观看| 综合视频一区| 日韩欧美美女一区二区三区| 中文字幕免费一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 日韩一区二区三区电影| 99久久精品国产一区二区三区| 久久天天躁日日躁| 精品视频一区二区在线观看| eeuss影院网站免费观看| 亚洲成av人片在www色猫咪| 嫩草影院视频| 日本精品一级二级| 亚洲免费视频一区二区三区| 激情视频一区| 亚洲桃色综合影院| eeuss国产一区二区三区四区| 99久久99久久久精品齐齐| 日本女优北野望在线电影| 欧美日韩国产精品一卡| 最新成人av在线| 国产三级伦理片| 亚洲午夜小视频| 古装做爰无遮挡三级聊斋艳谭| 精品少妇3p| 久久99九九| 色哟哟中文字幕| 97在线精品国自产拍中文| 日韩午夜av一区| 品久久久久久久久久96高清| 四虎www4hu永久免费| 91在线视频播放地址| 色婷婷综合久久久中字幕精品久久| 福利小视频在线| 国产剧情在线视频| 亚洲精品国产a久久久久久| 欧美一区二区在线观看视频| 欧美自拍第一页| 亚洲欧洲日产国码无码久久99| 亚洲色图丝袜美腿| 成人性a激情免费视频| 视频区 图片区 小说区| 国产在线视频精品一区| 亚洲精品久久久北条麻妃| 成人黄色综合网站| 秋霞av鲁丝片一区二区| 中文字幕不卡每日更新1区2区| 日韩亚洲欧美一区二区| 69xxx视频hd| 欧洲熟妇的性久久久久久| 欧美日韩亚洲国内综合网俺| 国产三级精品三级在线观看国产| 日本一二三区在线| 国产欧美在线观看一区| 亚洲精华一区二区三区| 猫咪成人官网| 国产精品视频久久久久久| 在线视频你懂得| av天堂永久资源网| 日本黄色一区二区| 久久久婷婷一区二区三区不卡| 麻豆视频在线| 日本调教视频在线观看| 神马电影久久| 簧片在线免费看| 看看黄色一级片| av综合网站| 亚洲综合中文字幕在线观看| 亚洲狠狠婷婷综合久久蜜桃| 久久偷看各类wc女厕嘘嘘偷窃| 丝瓜av网站精品一区二区| 在线免费av网站| 动漫成人在线观看| 最新亚洲国产精品| 女人黄色免费在线观看| 免费激情小视频| 成年人视频免费看| 国产美女精品视频国产| 日韩精品在线私人| 久久免费偷拍视频| 亚洲三级色网| 亚洲少妇屁股交4| a视频在线观看免费| 涩涩视频免费网站| 久热精品在线观看| 97电影在线观看| 国产原创在线视频| 91久久精品午夜一区二区| 欧美午夜精品理论片| 成人免费xx| 欧美高清在线视频观看不卡| 免费特级黄色片| www.av91| 少妇视频在线播放| 国产精品v欧美精品v日韩精品| 欧美黑人巨大xxxxx| 久草福利资源在线视频| 二区三区在线视频| 国产精品久久一区| 五月天婷婷在线视频| 成人综合国产精品| 四虎成人免费观看在线网址| 国产一区在线观看视频| 91国内精品视频| 欧美色老头old∨ideo| 午夜久久久影院| 香蕉精品999视频一区二区| 99r精品视频| 亚洲免费在线| 亚洲精品久久7777| 国产精品嫩草影院com| 中文字幕佐山爱一区二区免费| 在线观看免费黄色网址| 激情成人亚洲| 日韩va欧美va亚洲va久久| 久久午夜影院| 美国十次了思思久久精品导航| 狠狠精品干练久久久无码中文字幕| 国产尤物99| 老牛影视免费一区二区| 亚洲国产成人av在线| 日本少妇吞精囗交| 色综合天天狠狠| 在线观看视频网站你懂得| 亚洲成人手机在线| 国产黄色一区| 精品久久久久久亚洲综合网| 久久精品欧美日韩| 一区二区三区不卡视频| 免费不卡视频| 最近免费观看高清韩国日本大全| 国产在线三区| 人妻熟妇乱又伦精品视频| 色综合久久av| 成人自拍av| 欧美性生活大片视频| 精品久久五月天| 肉色欧美久久久久久久免费看| 国产麻豆高清视频在线第一页| 污黄视频在线观看| 无码精品人妻一区二区| 成人看片黄a免费看在线| 91精品国产91久久综合| 国产欧美熟妇另类久久久| 国产精品igao视频网网址不卡日韩| 日韩成人在线观看视频| 精品人妻一区二区色欲产成人| 国产无遮挡在线观看| 在线视频网站| 精品欧美国产一区二区三区| 国产xxxxhd| 国产电影精品久久禁18| 中文字幕中文字幕中文字幕亚洲无线| 懂色av一区二区三区| 伊人网综合在线| 91精彩在线视频| 精品视频免费在线观看| 免费黄色av片| 亚洲夜间福利| 欧美视频在线播放| 日韩在线精品强乱中文字幕| 欧美中文字幕一区二区| 久久午夜羞羞影院免费观看| 日本在线观看| 欧美午夜不卡影院在线观看完整版免费| 最新高清无码专区| 亚洲网站三级| av天在线观看| 在线观看亚洲国产| 精品视频在线观看一区二区| 亚洲成人精品在线观看| 国产精品麻豆入口| www.四虎在线| av在线一区二区三区| 在线观看一区视频| 亚洲国产女人aaa毛片在线| 精品成av人一区二区三区| 欧美中文字幕亚洲一区二区va在线| 国产偷国产偷亚洲高清97cao| 亚洲黄一区二区三区| 国内自拍视频一区| 成人免费看黄| 2017天天干夜夜操| 欧美亚洲国产一区| 一区二区三区四区在线免费视频| a天堂资源在线观看| 99视频都是精品热在线播放| 国产精品一品视频| 国产精品视频久久久| 久久精品久久久久久久| 羞羞答答一区二区| 欧美激情自拍偷拍| 欧美一级淫片免费视频| 高潮一区二区三区| 可以看美女隐私的网站| 动漫美女无遮挡免费| 日本一区二区视频在线播放| 松下纱荣子在线观看| 亚洲男人的天堂在线观看| 亚洲一区中文字幕在线| 午夜精彩视频| 精品一区二区三区自拍图片区| 911亚洲精品| 黄色三级免费电影| 欧美丰满少妇xxxxx| 成人免费毛片日本片视频| 午夜福利一区二区三区| 97视频资源在线观看| 八戒八戒神马在线电影| eeuss一区二区三区| 激情视频一区二区| 香蕉国产精品| 国产一区二区三区高清在线观看| 中国日本在线视频中文字幕| 国产成人亚洲精品| 九九热爱视频精品视频| 久久精品一级| 老司机午夜在线| 糖心vlog免费在线观看| ady日本映画久久精品一区二区| 色999久久久精品人人澡69| 成人自拍av| 国产黄网站在线观看| 午夜激情视频在线播放| 欧美视频在线一区二区三区| 国产精品日韩久久久| 午夜成人鲁丝片午夜精品| 国产美女高潮视频| 四季av一区二区| 影音先锋中文字幕影院| 亚洲一区av| 99亚偷拍自图区亚洲| 白白操在线视频| 国产精品久久久久久久久免费樱桃| 韩国av中文字幕| 中文字幕 欧美激情| 91人人爽人人爽人人精88v| 91丝袜美腿美女视频网站| 国产人与zoxxxx另类91| 99riav国产| 欧美亚洲国产日韩2020| 黑人40厘米全进去| 四虎影视永久免费观看| 欧美性生交xxxxxdddd| 久久午夜免费电影| 亚洲调教欧美在线| av电影一区二区三区| 国产欧美一区二区三区视频|