目錄和文件舉例

PHP如何操作目錄與文件?

一、文件目錄操作

文件目錄是指存儲在磁盤中的文件的索引,也可以將其視爲一個文件夾,在這個文件夾中可以存放其他文件或文件夾。最頂層的目錄是磁盤的根目錄,用“/”或“\\”表示。“/”表示當前工作目錄,“../”表示Apache的文件根目錄。文件夾前不指定位置,則默認在當前工作目錄中查找。

1.創建和刪除目錄

使用mkdir()函數可以根據提供的目錄名或目錄的全路徑,創建新的目錄,成功則返回TRUE,否則返回FALSE。

使用rmdir()函數可以刪除一個空目錄,但必須具有相應的權限,如果目錄不爲空,必須先刪除目錄中的文件才能刪除目錄。刪除成功則返回TRUE,否則返回FALSE。

2.獲取和更改當前工作目錄

當前工作目錄是指正在運行的文件所處的目錄,使用getcwd()函數可以取得當前的工作目錄,該函數沒有參數,成功則返回當前的工作目錄,失敗則返回FALSE。

使用chdir()函數可以設置當前的工作目錄,該函數的參數是新的當前目錄。

“@”錯誤控制運算符可以用於抑制錯誤信息。

3.打開和關閉目錄句柄

文件和目錄的訪問都是通過句柄實現的,使用opendir()函數可以打開一個目錄句柄,該函數的參數是打開的目錄路徑,打開成功則返回TRUE,失敗則返回FALSE,打開句柄後其他函數就可以調用該句柄。爲了節省服務器資源,使用完一個已經打開的目錄句柄後,應該用closedir()函數關閉這個句柄。

4.讀取目錄內容

readdir()函數讀取目錄內容,該函數參數是一個已經打開的句柄目錄。該函數在每次調用時返回目錄中下一個文件的文件名,在列出了所有的文件名後,函數返回FALSE。該函數結合while循環可以實現對目錄的遍歷。

PHP是弱類型語言,所以將整數值0和布爾值FALSE視爲等價,如果使用比較運算符“==”或“!=”,當遇到目錄中有一個文件的文件名爲“0”時,則遍歷目錄的循環將停止。所以在設置判斷條件時要使用“===”和“!==”運算符進行強類型檢查。

5.獲取指定路徑的目錄和文件

scandir()函數列出指定路徑中的目錄和文件。

array scandir(string $directory[,int $sorting_order[,resource $context]])

$directory爲指定路徑。參數$sorting_order默認是按字母升序排列,如果設爲1表示按字母的降序排列。$context是可選參數,是一個資源變量,可以用stream_context_create()函數生成,這個變量保存着與具體的操作對象有關的一些數據。函數運行成功則返回一個包含指定路徑下的所有目錄和文件名的數組,失敗則返回FALSE。

二、操作文件的一般方法

操作文件的一般方法有打開、讀取、寫入、關閉等。

如果要將數據寫入一個文件,一般先要打開該文件,如果文件不存在則先創建它,然後將數據寫入文件,最後還需要關閉這個文件。

如果要讀取一個文件中的數據,同樣要先打開該文件,如果文件不存在則自動退出,如果文件存在則讀取該文件的數據,讀完數據後關閉文件。

無論如何,如果想對文件操作,都要先打開文件,使用完文件後需要關閉文件。

1.文件的打開與關閉

打開文件使用fopen()函數。

resource fopen(string $filename,string $mode[,bool $use_include_path[,resource $context]])

Ⅰ$filename參數。fopen()函數將$filename參數指定的名字資源綁定到一個流上。

如果$filename的值是一個由目錄和文件名組成的字符串,則PHP認爲指定的是一個本地文件,將嘗試在該文件上打開一個流。如果文件存在,函數將返回一個句柄,如果文件不存在或沒有該文件的訪問權限,則返回FALSE。

如果$filename是“scheme://...”格式,則被當作一個URL,PHP將搜索協議處理器來處理此模式。如果訪問的文件不存在或沒有訪問權限,函數返回FALSE。

訪問本地文件時,在UNIX環境下,目錄中的間隔符爲正斜線“/”在Windows環境下可以是正斜線“/”或雙反斜線“\\”。另外要訪問URL形式的文件時,首先要確定PHP配置文件中的allow_url_fopen選項處於打開狀態,如果處於關閉狀態,PHP將發出一個警告,而fopen()函數則調用失敗。

Ⅱ$mode參數指定了fopen()函數訪問文件的模式

$mode說明
'r'只讀方式打開文件,從文件頭開始讀
'r+'讀寫方式打開文件,從文件頭開始讀寫
'w'寫入方式打開文件,將文件指針指向文件頭,如果文件已經存在則刪除已有內容,如果文件不存在則嘗試創建它
'w+'讀寫方式打開文件,將文件指針指向文件頭,如果文件已經存在則刪除已有內容,如果文件不存在則嘗試創建它
'a'寫入方式打開文件,將文件指針指向文件末尾,如果文件已有內容將從文件末尾開始寫。如果文件不存在則嘗試創建它
'a+'讀寫方式打開文件,將文件指針指向文件末尾,如果文件已有內容將從文件末尾開始讀寫,如果文件不存在則嘗試創建它
'x'創建並以寫入方式打開文件,將文件指針指向文件頭。如果文件已存在,則fopen()調用失敗並返回FALSE,並生成一條E_WARNING級別的錯誤信息。如果文件不存在則嘗試創建它
'x+'創建並以讀寫方式打開文件,將文件指針指向文件頭,如果文件已存在,則fopen()調用失敗並返回FALSE,並生成一條E_WARNING級別的錯誤信息。如果文件不存在則嘗試創建它
'b'二進制模式,用於連接在其他模式後面。如果文件系統能夠區分二進制文件和文本文件,需要使用到這個選項。

如果需要打開本地的二進制文件,操作與打開本地文件基本相同,主要區別在於操作二進制文件時,應在$mode取值的後面加上標記"b"作爲最後一個字符,在操作二進制文件時,不使用此標記可能會損壞文件。

Ⅲ$user_include_path參數。如果需要在include_path中搜尋文件,可以將可選參數$user_include_path的值設爲1或TRUE,默認爲FALSE

Ⅳ$context參數,可選的$context參數只有文件被遠程打開時才能使用,它是一個資源變量,其中保存着與fopen()函數具體的操作對象有關的一些數據。如果fopen()打開的是一個HTTP地址,那麼這個變量記錄着HTTP請求的請求類型、HTTP版本及其他頭信息,如果打開的是FTP地址,記錄的可能是FTP的被動/主動模式。

2.關閉文件

使用fclose()函數關閉文件

bool fclose(resource $handle)

參數$handle爲要打開的文件指針,文件指針必須有效,如果關閉成功則返回TRUE,否則返回FALSE。

三、文件的寫入

PHP中沒有專門用於創建文件的函數,一般可以使用fopen()函數來創建,文件模式可以是"w"、"w+"、"a"、"a+"。

Ⅰ fwrite()函數,文件打開後,向文件中寫入內容可以使用fwrite()函數。

int fwrite(resource $handle,string $string[,int $length])

參數$handle是寫入的文件句柄,$string是將要寫入文件的字符串數據,$length是可選參數,如果指定了$length,則當寫入了$string中的前$length個字符的數據後停止寫入。如果字符串$string中的字節數小於$length,則寫入整個字符串後就停止寫入。如果寫入操作成功,fwrite()函數將返回寫入的字節數,出現錯誤時返回FALSE。

fwrite()函數還有一個別名fputs(),fwrite()函數還可用於寫入二進制文件。

如果以寫入方式“w”打開文件,寫入的新數據將覆蓋舊數據,如果不想覆蓋之前的數據而將新數據添加到文件末尾,可以使用追加模式"a"來打開文件。

Ⅱ file_put_contents()函數

int file_put_contents(string $filename,string $data[,int $flags[,resource $context]])

$filename是要寫入數據的文件名,$data是要寫入的字符串,$data也可以是數組,但不能爲多維數組。在使用FTP或HTTP向遠程文件寫入數據時,可以使用可選參數$flags和$context。寫入成功後漢書返回寫入的字節數,否則返回FALSE。

Ⅲ fputcsv()函數。CSV是一種比較常見的文件格式,一般以.csv作爲擴展名。CSV格式把文件的一行看作是一條記錄,記錄裏的字段使用逗號分隔。在PHP中使用fputcsv()函數可以把制定的數組格式化爲符合CSV文件格式的內容,並寫入文件指針指向的當前行。

int fputcsv(resource $handle[,array $fileds[,string $delimiter[,string $enclosure]]])

參數$handle是要寫入的文件句柄,參數$fileds是要格式化的數組。可選$delimiter參數用於設定字段分界符(只允許一個字符),默認爲逗號。可選的$enclosure參數設定字段環繞符(只允許一個字符),默認爲雙引號。

四、文件的讀取

1.讀取任意長度

fread()函數可以用於讀取文件的內容

string fread(int $handle,int $length)

參數$handle是已經打開的文件指針,$length是指定讀取的最大字節數,$length的最大取值爲8192。如果讀完$length個字節數之前遇到文件結尾標誌(E0F),則返回所讀取的字符,並停止讀取操作。如果讀取成功則返回所讀取的字符串,如果出錯返回FALSE。

feof()函數用於判斷是否到達文件末尾,feof()函數只有一個參數,就是文件句柄,如果文件指針到達文件末尾,則feof()函數返回TRUE,否則返回FALSE。

filesize()函數的作用是取得文件內容的字節數

2.讀取整個文件

Ⅰ file()函數用於將整個文件讀取到一個數組中

array file(string $filename[,int $use_include_path[,resource $context]])

本函數的作用是將文件作爲一個數組返回,數組中的每個單元都是文件中相應的一行,包括換行符在內。如果失敗則返回FALSE。參數$filename是讀取的文件名。

file()函數不適合操作很大的文件,如果文件過大,加載到數組中,數組需要的內存可能會超過可用內存。

Ⅱ readfile()函數。readfile()函數用於輸出一個文件的內容到瀏覽器中,語法格式如下:

int readfile(string $filename[,bool $use_include_path[,resource $context]])

該函數打開一個文件,讀取該文件並寫入到輸出緩衝,並返回從文件中讀入的字節數。如果出錯則返回FALSE,最後關閉這個文件。

Ⅲ fpassthru()函數可以將給定的文件指針從當前位置讀取到EOF,並把結果寫到輸出緩衝區,要使用這個函數,必須先使用fopen()函數打開文件,然後將文件指針作爲參數傳遞給fpassthru()函數,fpassthru()函數把文件指針所指向的文件內容發送到標準輸出,如果操作成功返回讀取到的字節數,否則返回FALSE。

如果既不修改文件也不在特定位置檢索,只想將文件的內容下載到輸出緩衝區,應該使用readfile()函數。

Ⅳ file_get_contents()函數可以將整個或部分文件內容讀取到一個字符串中

string file_get_contents(string $filename[,int $offset[,int $maxlen]])

$filename是要讀取的文件名,可選參數$offset可以指定從文件頭開始的偏移量,函數可以返回從$offset所指定的位置開始長度爲$maxlen的內容,如果失敗,函數將返回FALSE。

file_get_contents()函數是用來將文件的內容讀入到一個字符串中的首選方法。

3.讀取一行數據

Ⅰ fgets()函數可以從文件中讀取一行文本

string fgets(int $handle[,int $length])

$handle是已經打開的文件句柄,可選參數$length指定了返回的最大字節數,考慮到行結束符,最多可以返回$length-1個字節的字符串,如果沒有制定$length,默認爲1024個字節。

Ⅱ fgetss()函數是從文件指針處讀取一行數據,不過fgetss()函數會嘗試從讀取的文本中去掉任何HTML和PHP標記。

string fgetss(resource $handle[,int $length[,string $allowable_tags]])

可選的第三個參數$allowable_tags用於指定哪些標記不被去掉。

Ⅲ fgetcsv()函數可以讀取指定文件的當前行,使用CSV格式解析出字段,並返回一個包含這些字段的數組。

array fgetcsv(int $handle[,int $length[,string $delimiter[,string $enclosure]]])

$handle是打開的文件句柄,$length指定獲取的字符的最大長度。可選的$delimiter參數用於設定字段分界符(只允許一個字符),默認爲逗號,可選的$enclosure參數設定字段環繞符(只允許一個字符),默認爲雙引號。

4.讀取一個字符

Ⅰ fgetc()函數可以從文件指針處讀取一個字符。

string fgetc(resource $handle)

該函數返回$handle指針指向的文件中的一個字符,遇到EOF則返回FALSE。

5.使用指定格式讀取文件

fscanf()函數可以讀取文件中的數據,並根據制定的格式進行格式化,並返回一個數組。

mixed fscanf(resource $handle,string $format[,mixed &$...])

fscanf()函數從與$handle關聯的文件中接收輸入並根據指定的$format來解釋輸入。如果只給此函數傳遞了這兩個參數,解析後的值會被作爲數組返回,否則如果提供了可選參數,此函數將返回被複制的數目,可選參數必須用引用傳遞。

格式字符串中的任何空白會與輸入流中的任何空白匹配,這意味着甚至格式字符串中的製表符"\t"也會與輸入流中的一個空格字符串匹配。

五、文件的上傳與下載

在PHP中實現文件的上傳與下載,都需要使用文件系統函數來完成。處理上傳文件的函數是move_uploaded_file(),實現文件下載可以使用header()和readfile()函數來完成。

1.文件上傳

上傳文件可以通過提交HTML表單來實現。

$_FILES是一個二維數組,上傳後的文件信息可以使用以下形式獲取:

Ⅰ $FILES['file']['name']。客戶端上傳的原文件名。其中“file”是HTML表單中文件域控件的名稱。

Ⅱ $FILES['file']['type']。文件上傳的類型,需要瀏覽器提供該信息的支持。常用的值有“text/plain”表示普通文本文件,“image/gif”表示GIF圖片,“image/pjpeg”表示JPEG圖片,“application/msword”表示word文件,“text/html”表示html格式的文件,“application/pdf”表示PDF格式文件,“audio/mpeg”表示MP3格式的音頻文件,“application/x-zip-compressed”表示zip格式的壓縮文件,“application/octet-stream”表示二進制流文件。

Ⅲ $FILES['file']['tmp_name'],文件被上傳後再服務器端存儲的臨時文件名

Ⅳ $FILES['file']['size'].已上傳文件的大小,單位爲字節

Ⅴ $FILES['file']['errot'],錯誤信息代碼,值爲0表示沒有錯誤發生,文件上傳成功。值爲1表示上傳的文件超過了php.ini文件中的upload_max_filesize選項限制的值。值爲2表示上傳文件的大小超過了HTML表單中規定的最大值。值爲3表示文件只有部分被上傳,值爲4表示沒有文件被上傳,值爲5表示上傳文件大小爲0.

文件上傳結束後,默認地存儲在臨時目錄中,這時必須將其從臨時目錄中刪除或移動到其他地方,不管是否上傳成功,腳本執行完後臨時目錄裏的文件肯定會被刪除,所以在刪除之前要使用PHP的move_uploaded_file()函數將它移動到其他位置,此時,才完成了上傳文件過程。move_uploaded_file()函數的語法格式:

bool move_uploaded_file(string $filename,string $destination)

$filename參數是上傳的文件名,如果$filename指定的是合法的文件,則函數會將文件移動至有$destination參數指定的文件。如果目標文件已經存在,會被新文件覆蓋。如果上傳文件不合法或文件無法移動,函數則不會進行任何操作並返回FALSE。

在將文件移動之前需要檢查文件是否是通過HTTP POST上傳的,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,這需要使用is_uploaded_file()函數。該函數的參數爲文件的臨時文件名,若文件是通過HTTP POST上傳的,則函數返回TRUE。

要使HTML表單產生文件上傳變量必須滿足3個條件:表單必須使用POST方法提交;<form>標記enctype屬性規定了在提交表單時要使用那種內容類型,在表單需要二進制數據時,比如文件內容,必須使用enctype值爲“multipart/form-data”;表單中要包含一個文件域控件。

2.文件下載

如果是普通的文件下載,建立一個超鏈接指向目標文件就可以了。要實現安全的文件下載,在PHP中一般使用header()的readfile()函數來完成。

header()函數的作用是向瀏覽器發送正確的HTTP報頭,報頭指定了網頁內容的類型、頁面的屬性等信息。header()函數的功能很多,舉例如下:

Ⅰ 頁面跳轉。如果header()函數的參數爲“Location:xxx”,頁面就會自動跳轉到“xxx”指向的URL地址。

Ⅱ 指定頁面內容。例如,同樣一個XML格式的文件,如果header()函數的參數指定爲“Content-type:application/xml”,瀏覽器會將其按照XML文件格式來解析。但如果是“Content-type:text/xml”,瀏覽器就會將其看作文本解析。

Ⅲ 文件下載。header()函數結合readfile()函數可以下載將要瀏覽的文件。

注意:如果服務器的輸出緩存沒有開啓,在調用header()函數之前如果輸出了內容,如普通的HTML標記、空格、PHP輸出等,在調用header()函數就會出錯。開啓輸出緩存之後,輸出的內容在執行過程中被放進緩存裏,在調用header()函數就不會出錯。開啓輸出緩存的方法是修改PHP配置文件php.ini文件中“output_buffering”選項的值。在舊的PHP版本中,“output_buffering”選項的默認值爲Off,表示關閉緩存,需要修改爲On或大於0的整數。

六、其他常用文件函數

1.計算文件大小

使用filesize()函數計算文件的大小,以字節爲單位。

filesize()函數結合fread()函數可以實現一次讀取整個文件(或某部分)。

fileatime()函數用於取得文件的上次訪問時間,fileowner()函數用於取得文件的所有者,filetype()函數用於取得文件的類型。

2.判斷文件是否存在

如果希望在不打開文件的情況下檢查文件是否存在,可以使用file_exists()函數。函數的參數爲指定的文件或目錄,如果該文件或目錄存在,則返回TRUE,否則返回FALSE。

is_dir()函數用於判斷給定文件名是否是目錄,is_file()函數用於判斷給定文件名是否是文件,is_readable()函數用於判斷給定文件名是否可讀,is_writeable()函數用於判斷給定文件是否可寫。

3.刪除文件

使用unlink()函數可以刪除不需要的文件,成功即返回TRUE,否則返回FALSE。

4.複製文件

使用copy()函數可以完成複製一個文件或目錄到某個文件夾的情況。語法格式如下;

bool copy(string $source,string $dest)

參數$source爲需要複製的源文件,參數$dest爲目標文件。複製後的新文件中內容與源文件完全相同,並且在複製文件的同時,也可以爲新文件重新命名。複製成功即返回TRUE,否則返回FALSE。如果目標文件已經存在,則將被覆蓋。

5.移動、重命名文件

出來move_uploaded_file()函數,還有一個rename()函數也可以移動文件。

bool rename(string $oldname,string $newname[,resource $context])

rename()函數主要用於對一個文件進行重命名,$oldname是文件的舊名,$oldname爲新的文件名。如果$oldname與$newname的路徑不相同,就實現了移動該文件的功能。

6.文件指針操作

PHP中有很多操作文件指針的函數,如rewind()、ftell()、fseek()函數等。feof()函數用於測試文件指針是否處於文件尾部,也屬於文件指針操作函數。

Ⅰ rewind()函數用於重置文件的指針位置,使指針返回到文件頭。它的參數只有一個,就是已經打開的指針文件的文件句柄。

Ⅱ ftell()函數。可以以字節爲單位,報告文件中指針的位置,也就是文件流中的偏移量。它的參數也是已經打開的文件句柄。

Ⅲ fseek()函數。可以用於移動文件指針,語法格式如下:

int fseek(resource $handle,int $offset[,int $whence])

說明:fseek()函數可以將文件指針$handle,從$whence位置移動$offset個字節。新位置從文件頭開始以字節數度量,以$whence指定的位置加上$offset。可選參數$whence的值可以是:SEEK_SET(文件開始處)、SEEK_CUR(文件指針的當前位置)和SEEK_END(文件末尾)。如果沒有指定$whence,默認爲SEEK_SET,要移動到文件末尾的位置,需要$offset傳遞一個負值。函數如果操作成功則返回0,否則返回-1.注意,移動到EOF之後的位置不算錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章