在本教程中,您將學(xué)習(xí)如何使用PHP的文件系統(tǒng)函數(shù)動態(tài)創(chuàng)建,訪問(或讀?。┖筒倏v文件。
由于PHP是服務(wù)器端編程語言,因此它使您可以使用Web服務(wù)器上存儲的文件和目錄。在本教程中,您將學(xué)習(xí)如何使用PHP文件系統(tǒng)函數(shù)在Web服務(wù)器上創(chuàng)建,訪問和操作文件。
要使用文件,首先需要打開文件。PHP fopen()函數(shù)用于打開文件。該函數(shù)的基本語法可以通過以下方式給出:
fopen(filename, mode)
傳遞給fopen()的第一個參數(shù)指定要打開的文件的名稱,第二個參數(shù)指定應(yīng)以哪種模式打開文件。 例如:
可以通過以下方式之一打開文件:
模式 | 它能做什么 |
---|---|
r | 打開文件只讀。 |
r+ | 打開文件進行讀寫。 |
w | 打開僅用于寫入的文件,并清除文件內(nèi)容。如果該文件不存在,PHP將嘗試創(chuàng)建它。 |
w+ | 打開文件進行讀寫,并清除文件內(nèi)容。如果該文件不存在,PHP將嘗試創(chuàng)建它。 |
a | 追加。打開僅用于寫入的文件。通過寫入文件末尾來保留文件內(nèi)容。如果該文件不存在,PHP將嘗試創(chuàng)建它。 |
a+ | 讀取/追加。打開文件進行讀寫。通過寫入文件末尾來保留文件內(nèi)容。如果該文件不存在,PHP將嘗試創(chuàng)建它。 |
x | 打開僅用于寫入的文件。 如果文件已存在,則返回False并生成錯誤。 如果該文件不存在,PHP將嘗試創(chuàng)建它。 |
x+ | 打開文件進行讀寫;否則,其行為與“ x”相同。 |
如果您試圖打開一個不存在的文件,PHP將生成一條警告消息。因此,為了避免這些錯誤消息,在嘗試訪問某個文件或目錄之前,應(yīng)該使用PHP file_exists()函數(shù)實現(xiàn)一個簡單的檢查,檢查文件或目錄是否存在。
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ // 嘗試打開該文件 $handle = fopen($file, "r"); } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
提示:對文件和目錄的操作容易出錯。因此,實現(xiàn)某種形式的錯誤檢查是一個好習(xí)慣,這樣,如果發(fā)生錯誤,您的腳本將可以優(yōu)雅地處理錯誤。請參考有關(guān)PHP錯誤處理的教程。
使用完文件后,需要將其關(guān)閉。fclose()函數(shù)用于關(guān)閉文件,如以下示例所示:
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ //打開要讀取的文件 $handle = fopen($file, "r") or die("ERROR: Cannot open the file."); /* 這里是一些要執(zhí)行的代碼 */ //正在關(guān)閉文件句柄 fclose($handle); } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
注意:雖然PHP會在腳本終止時自動關(guān)閉所有打開的文件,但最好在執(zhí)行所有操作后關(guān)閉文件。
現(xiàn)在您已經(jīng)了解了如何打開和關(guān)閉文件。 在下一節(jié)中,您將學(xué)習(xí)如何從文件中讀取數(shù)據(jù)。 PHP有幾個用于從文件讀取數(shù)據(jù)的函數(shù)。 您可以使用單個操作從一個字符讀取整個文件。
fread()函數(shù)可用于從文件中讀取指定數(shù)量的字符??梢允褂么撕瘮?shù)的基本語法。
fread(file handle, length in bytes)
此函數(shù)接受兩個參數(shù)-文件句柄和要讀取的字節(jié)數(shù)。 下面的示例從“data.txt”文件讀取20個字節(jié),包括空格。 假設(shè)文件“data.txt”包含一段文本“The quick brown fox jumps over the lazy dog.”。
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ //打開要讀取的文件 $handle = fopen($file, "r") or die("ERROR: Cannot open the file."); //從文件中讀取固定的字節(jié)數(shù) $content = fread($handle, "20"); //關(guān)閉文件的句柄 fclose($handle); //顯示文件內(nèi)容 echo $content; } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
上面的示例將產(chǎn)生以下輸出:
The quick brown fox
fread()函數(shù)可以與filesize()函數(shù)結(jié)合使用,一次讀取整個文件。filesize()函數(shù)的作用是:以字節(jié)為單位返回文件的大小。
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ //打開要讀取的文件 $handle = fopen($file, "r") or die("ERROR: Cannot open the file."); //正在讀取整個文件 $content = fread($handle, filesize($file)); //正在關(guān)閉文件句柄 fclose($handle); //顯示文件內(nèi)容 echo $content; } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
上面的示例將產(chǎn)生以下輸出:
The quick brown fox jumps over the lazy dog.
在PHP中讀取文件全部內(nèi)容的最簡單方法是使用readfile()函數(shù)。此函數(shù)允許您在不需要打開文件的情況下讀取文件的內(nèi)容。以下示例將生成與上述示例相同的輸出:
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ //讀取并輸出整個文件 readfile($file) or die("ERROR: Cannot open the file."); } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
上面的示例將產(chǎn)生以下輸出:
The quick brown fox jumps over the lazy dog.
另一種無需打開即可讀取文件全部內(nèi)容的方法是使用file_get_contents()函數(shù)。此函數(shù)接受文件的名稱和路徑,并將整個文件讀入字符串變量。下面是一個實例:
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ // 將整個文件讀入字符串 $content = file_get_contents($file) or die("ERROR: Cannot open the file."); //顯示文件內(nèi)容 echo $content; } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
從文件讀取全部數(shù)據(jù)的另一種方法是PHP的file()函數(shù)。 它的功能與file_get_content()函數(shù)類似,但它將文件內(nèi)容作為行數(shù)組返回,而不是以單個字符串的形式返回。 返回的數(shù)組的每個元素對應(yīng)于文件中的一行。
要處理文件數(shù)據(jù),您需要使用foreach循環(huán)遍歷數(shù)組。這是一個示例,該示例將文件讀入數(shù)組,然后使用循環(huán)顯示它:
<?php $file = "data.txt"; //檢查文件是否存在 if(file_exists($file)){ //將整個文件讀入數(shù)組 $arr = file($file) or die("ERROR: Cannot open the file."); foreach($arr as $line){ echo $line; } } else{ echo "ERROR: File does not exist."; } ?>測試看看?/?
同樣,您可以使用PHP fwrite()函數(shù)將數(shù)據(jù)寫入文件或追加到現(xiàn)有文件。該函數(shù)的基本語法可以通過以下方式給出:
fwrite(file handle, string)
fwrite()函數(shù)接受兩個參數(shù)—文件句柄和要寫入的數(shù)據(jù)字符串,如以下示例所示:
<?php $file = "note.txt"; //要寫入的數(shù)據(jù)字符串 $data = "The quick brown fox jumps over the lazy dog."; //打開文件進行寫入 $handle = fopen($file, "w") or die("ERROR: Cannot open the file."); //將數(shù)據(jù)寫入文件 fwrite($handle, $data) or die ("ERROR: Cannot write the file."); //關(guān)閉文件句柄 fclose($handle); echo "數(shù)據(jù)已成功寫入文件。"; ?>
在上面的示例中,如果“ note.txt”文件不存在,PHP將自動創(chuàng)建該文件并寫入數(shù)據(jù)。但是,如果“ note.txt”文件已經(jīng)存在,PHP將在寫入新數(shù)據(jù)之前擦除此文件的內(nèi)容(如果有的話),但是,如果您只想追加文件并保留現(xiàn)有內(nèi)容,上面的示例請使用模式 a而不是w。
另一種方法是使用file_put_contents()函數(shù)。它是file_get_contents()函數(shù)的對應(yīng)功能,提供了一種無需打開即可將數(shù)據(jù)寫入文件的簡便方法。該函數(shù)接受文件的名稱和路徑以及要寫入文件的數(shù)據(jù)。這是一個實例:
<?php $file = "note.txt"; //要寫入的數(shù)據(jù)字符串 $data = "The quick brown fox jumps over the lazy dog."; //將數(shù)據(jù)寫入文件 file_put_contents($file, $data) or die("ERROR: Cannot write the file."); echo "數(shù)據(jù)已成功寫入文件。"; ?>
如果file_put_contents()函數(shù)中指定的文件已經(jīng)存在,則默認(rèn)情況下PHP將覆蓋它。如果要保留文件的內(nèi)容,可以將特殊FILE_APPEND標(biāo)志作為第三個參數(shù)傳遞給file_put_contents()函數(shù)。它將簡單地將新數(shù)據(jù)追加到文件中,而不是覆蓋它。這是一個實例:
<?php $file = "note.txt"; //要寫入的數(shù)據(jù)字符串 $data = "The quick brown fox jumps over the lazy dog."; //將數(shù)據(jù)寫入文件 file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file."); echo "數(shù)據(jù)已成功寫入文件。"; ?>
您可以使用PHP的rename()函數(shù)重命名文件或目錄,如下所示:
<?php $file = "file.txt"; //檢查文件是否存在 if(file_exists($file)){ //嘗試重命名文件 if(rename($file, "newfile.txt")){ echo "文件重命名成功。"; } else{ echo "錯誤:無法重命名文件。"; } } else{ echo "錯誤:文件不存在。"; } ?>
您可以使用PHP的unlink()函數(shù)刪除文件或目錄,如下所示:
<?php $file = "note.txt"; //檢查文件是否存在 if(file_exists($file)){ //嘗試刪除該文件 if(unlink($file)){ echo "文件已成功刪除。"; } else{ echo "錯誤:無法刪除文件。"; } } else{ echo "錯誤:文件不存在。"; } ?>
在下一章中,我們將學(xué)習(xí)有關(guān)在PHP中解析目錄或文件夾的更多信息。
下表概述了一些其他有用的PHP文件系統(tǒng)函數(shù),這些函數(shù)可用于動態(tài)讀取和寫入文件。
函數(shù) | 描述 |
---|---|
fgetc() | 一次讀取一個字符。 |
fgets() | 一次讀取一行。 |
fgetcsv() | 讀取一行用逗號分隔的值。 |
filetype() | 返回文件的類型。 |
feof() | 檢查是否已到達文件末尾。 |
is_file() | 檢查文件是否為常規(guī)文件。 |
is_dir() | 檢查文件是否為目錄。 |
is_executable() | 檢查文件是否可執(zhí)行。 |
realpath() | 返回規(guī)范化的絕對路徑名。 |
rmdir() | 刪除一個空目錄。 |
請查看PHP文件系統(tǒng)參考,以獲取其他有用的PHP文件系統(tǒng)函數(shù)。