關聯課件: 8子項目八 - 圖像處理函數(點擊在線預覽)
8.3.7 文件系統函數
8.3.7.1 文件系統函數概述
在網絡編程中要用到的文件操作大緻可以分爲兩(liǎng)大類,一種(zhǒng)是普通文件的操作,另一種(zhǒng)是數據庫文件的操作。在普通文件的操作中對(duì)記事(shì)本文件的操作最爲簡單,下面(miàn)就來探讨一下PHP對(duì)文件(以記事(shì)本爲例)的操作。PHP提供了一些文件操作的函數,常用函數如表6-7所示。
有關詳細功能(néng)和使用方法請參見PHP 5的幫助文檔。
8.3.7.2 文件的打開(kāi)與讀寫
要想利用PHP對(duì)文件進(jìn)行操作,就要先了解有關PHP中打開(kāi)和讀寫文件的相關函數。
1.fopen()函數
fopen()函數格式如下:
resource fopen (string filename, string mode [, bool use_include_path ])
fopen()函數的作用是打開(kāi)文件或者URL。其中filename是要打開(kāi)的文件名,必須爲字符串形式。如果filename是“scheme://...”(如https://...)的格式,則被當成(chéng)一個URL,PHP將(jiāng)搜索協議處理器(也被稱爲封裝協議)來處理此模式。如果PHP認爲filename指定的是一個本地文件(如“num.txt”),將(jiāng)嘗試在該文件上打開(kāi)一個流。該文件必須是PHP可以訪問的,因此需要确認文件訪問權限允許該訪問。mode是打開(kāi)文件的方式,必須爲字符形式,可以取以下幾個值。
'r':隻讀形式,文件指針指向(xiàng)文件的開(kāi)頭。
'r ':可讀可寫,文件指針指向(xiàng)文件的開(kāi)頭。
'w':隻寫形式,文件指針指向(xiàng)文件的開(kāi)頭,打開(kāi)同時清除所有内容,如果文件不存在,將(jiāng)嘗試建立文件。
'w ':可讀可寫,文件指針指向(xiàng)文件的開(kāi)頭,打開(kāi)同時清除所有内容,如果文件不存在,將(jiāng)嘗試建立文件。
'a':追加形式(隻可寫入),文件指針指向(xiàng)文件的最後(hòu),如果文件不存在,將(jiāng)嘗試建立文件。
'a ':可讀可寫,文件指針指向(xiàng)文件的最後(hòu),如果文件不存在,將(jiāng)嘗試建立文件。
2.fgets()函數
fgets()函數的格式如下:
string fgets (int handle [, int length])
fgets()函數的功能(néng)是從文件指針中讀取一行。其中handle是要讀入數據的文件流指針,由fopen函數返回數值。length是要讀入的字符個數,實際讀入的字符個數是length-1。
從handle指向(xiàng)的文件中讀取一行并返回長(cháng)度最多爲length-1字節的字符串。碰到換行符(包括在返回值中)、EOF或者已經(jīng)讀取了length-1字節後(hòu)停止(看先碰到那一種(zhǒng)情況)。如果沒(méi)有指定 length,則默認爲1K,也就是說1024字節。出錯時返回 FALSE。
3.fwrite()函數
fwrite()函數格式如下:
fwrite()函數的功能(néng)是int fwrite (resource handle, string string [, int length])
fwrite()函數的功能(néng)是寫入文件,與int fputs(resource handle, string str, int [length])功能(néng)相同。
fwrite()把string的内容寫入文件指針handle處。如果指定了length,當寫入了 length 個字節或者寫完了 string以後(hòu),寫入就會停止。
fwrite()返回寫入的字符數,出現錯誤時返回FALSE。
4.fclose()函數
fclose()函數的西格式如下:
bool fclose (resource handle)
fclose()函數的功能(néng)是關閉一個已打開(kāi)的文件指針,即將(jiāng)handle指向(xiàng)的文件關閉。如果成(chéng)功則返回TRUE,失敗則返回FALSE。
文件指針必須有效,并且是通過(guò)fopen()或fsockopen()成(chéng)功打開(kāi)的。
下面(miàn)就用以上幾個簡單的文件操作函數來編寫一個文本類型的訪客計數器。
1: <!--文件6-25.php:訪客計數器-->
2: <html>
3: <head>
4: <title>訪客計數器</title>
5: </head>
6: <body>
7: <?php
8: if (!file_exists("num.txt")){ //如果文件不存在
9: $fp=fopen("num.txt", "w"); //借助w參數,創建文件
10: fclose($fp); //關閉文件
11: echo "num.txt文件創建成(chéng)功!<br>";
12: }
13: $fp=fopen("num.txt","r");
14: @$num=fgets($fp,12); //讀取11位數字
15: if ($num=="") $num=0;
16: //如果文件的内容爲空,初始化爲0
17: $num ; //浏覽次數加一
18: @fclose($fp); //關閉文件
19: $fp=fopen("num.txt", "w"); //隻寫方式打開(kāi)num.txt文件
20: fwrite($fp,$num); //寫入加一後(hòu)結果
21: fclose($fp); //關閉文件
22: echo "您是第".$num."位浏覽者!"; //浏覽器輸出浏覽次數
23: ?>
24: </body>
25: </html>
當程序6-25.php第一次運行時,其運行結果如圖6-26(a)所示,第二次運行時,其運行效果如圖6-26(b)所示。
(a)第一次運行
(b)第二次運行
不難發(fā)現制作一個文件類型計數器的基本思路是:打開(kāi)一個文件→讀出文件裡(lǐ)面(miàn)的内容(數據)→數據 1後(hòu)再寫入該文件→關閉文件。由于當文件以可讀可寫方式打開(kāi)時,文件的内容同時被清空,所以做文件計數器時的具體的步驟是:以隻讀方式打開(kāi)一個文件→讀出文件裡(lǐ)面(miàn)的内容(數據)→關閉文件→再以可讀可寫方式打開(kāi)文件→數據 1後(hòu)再寫入該文件→關閉文件。
8.3.7.3 目錄的創建、删除與遍曆
目錄的操作主要是利用相關的目錄函數來實現的,先來看一下目錄有關的函數。
1)string getcwd (void)
功能(néng):取得當前工作目錄。
2)bool chdir (string directory)
功能(néng):將(jiāng)當前目錄改爲directory。
3)new dir(sting directory)
功能(néng):將(jiāng)輸入的目錄名轉換爲一個對(duì)象并返回,如:
class dir {
dir(string directory )
string path
resource handle
string read ( void )
void rewind ( void )
void close ( void )
}
該對(duì)象含有2個屬性和3個方法。2個屬性爲:
handle:目錄句柄。
path:打開(kāi)目錄的路徑。
3個方法爲:
read (void):讀取目錄。
rewind (void):複位目錄。
close (void):關閉目錄。
這(zhè)3個方法與後(hòu)面(miàn)的將(jiāng)要介紹的readdir()、rewinddir()、closedir()函數的作用相同。
4)resource opendir (string path)
功能(néng):打開(kāi)目錄句柄。path爲要打開(kāi)的目錄路徑.
5)string readdir (resource dir_handle)
功能(néng):返回目錄中下一個文件的文件名。文件名以在文件系統中的排序返回。
6)dir_handle爲目錄句柄的resource,之前由opendir()打開(kāi)。
功能(néng):成(chéng)功則返回文件名,失敗返回FALSE。
7)void rewinddir (resource dir_handle)
功能(néng):倒回目錄句柄。將(jiāng)dir_handle指定的目錄流重置到目錄的開(kāi)頭。dir_handle爲目錄句柄的resource,之前由opendir()打開(kāi)。
8)void closedir (resource dir_handle)
功能(néng):關閉目錄句柄。關閉由dir_handle指定的目錄流。流必須已被opendir()打開(kāi)。
9)array scandir (string directory [, int sorting_order])
功能(néng):列出指定路徑中的文件和目錄。返回一個array,包含有directory中的文件和目錄。
參數directory是要被浏覽的目錄。
參數sorting_order是文件的排列順序,默認的排序順序是按字母升序排列。如果使用了可選參數 sorting_order(設爲1),則排序順序是按字母降序排列。
10)bool chroot (string directory)
將(jiāng)當前進(jìn)程的根目錄改變爲directory。
本函數僅在系統支持且運行于CLI、CGI或嵌入SAPI版本時才能(néng)正确工作。此外本函數還(hái)需要root權限。
現舉例如下:
1: <!--文件6-26.php:目錄輸出-->
2: <HTML>
3: <HEAD>
4: <TITLE>目錄輸出</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $dir=getcwd(); //獲取當前路徑
9: echo getcwd(). "<br>"; //輸出當前目錄
10: $files1=scandir($dir); //列出指定路徑中的文件和目錄
11: $files2=scandir($dir,1);
12: print_r($files1); //輸出指定路徑中的文件和目錄
13: print_r($files2);
14: $dir=dir($dir);
15: echo gettype($dir)."<br>";
16: echo "目錄句柄:".$dir->handle."<br>";
17: echo "目錄路徑:".$dir->path."<br>";
18: while ($entry=$dir->read())
19: echo $entry.";<br> ";
20: $dir->close();
21: if (chdir("c:/windows")){
22: echo "當前目錄更改成(chéng)功:c:/windows<br>";
23: }else{
24: echo "當前目錄更改失敗!<br>";
25: }
26: ?>
27: </BODY>
28: </HTML>
程序6-26.php運行結果如圖6-27所示。
圖6-27 程序6-26.php的運行結果
下面(miàn)再來看一個例子,具體體會一下目錄操作在實際中的應用。
1: <!--文件6-27.php:遍曆圖片顯示-->
2: <HTML>
3: <HEAD>
4: <TITLE>遍曆圖片顯示</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $addr="./image/";
9: $dir=dir($addr);
10: while ($file_name=$dir->read()){
11: if ($file_name=="." or $file_name==".."){
12: }else{
13: echo "<img src=".$addr.$file_name." width=40 height=
30>&n bsp; ";
14: }
15: }
16: ?>
17: </BODY>
18: </HTML>
其運行結果如圖6-28所示。
圖6-28 程序6-27.php的運行結果
fopen()函數的作用是打開(kāi)文件或者URL。其中filename是要打開(kāi)的文件名,必須爲字符串形式。如果filename是“scheme://...”(如http://...)的格式,則被當成(chéng)一個URL,PHP將(jiāng)搜索協議處理器(也被稱爲封裝協議)來處理此模式。如果PHP認爲filename指定的是一個本地文件(如“num.txt”),將(jiāng)嘗試在該文件上打開(kāi)一個流。該文件必須是PHP可以訪問的,因此需要确認文件訪問權限允許該訪問。mode是打開(kāi)文件的方式,必須爲字符形式,可以取以下幾個值。 'r':隻讀形式,文件指針指向(xiàng)文件的開(kāi)頭。 'r ':可讀可寫,文件指針指向(xiàng)文件的開(kāi)頭。 'w':隻寫形式,文件指針指向(xiàng)文件的開(kāi)頭,打開(kāi)同時清除所有内容,如果文件不存在,將(jiāng)嘗試建立文件。 'w ':可讀可寫,文件指針指向(xiàng)文件的開(kāi)頭,打開(kāi)同時清除所有内容,如果文件不存在,將(jiāng)嘗試建立文件。 'a':追加形式(隻可寫入),文件指針指向(xiàng)文件的最後(hòu),如果文件不存在,將(jiāng)嘗試建立文件。 'a ':可讀可寫,文件指針指向(xiàng)文件的最後(hòu),如果文件不存在,將(jiāng)嘗試建立文件。
通過(guò)這(zhè)節課的學(xué)習,我明白了fclose()函數的功能(néng)是j關閉一個已打開(kāi)的文件指針,即將(jiāng)handle指向(xiàng)的文件關閉。如果成(chéng)功則返回TRUE,失敗則返回FALSE。
更加清晰明了