在本教程中,您將學習如何使用PHP的文件系統(tǒng)函數(shù)動態(tài)創(chuàng)建,訪問(或讀?。┖筒倏v文件。
由于PHP是服務器端編程語言,因此它使您可以使用Web服務器上存儲的文件和目錄。在本教程中,您將學習如何使用PHP文件系統(tǒng)函數(shù)在Web服務器上創(chuàng)建,訪問和操作文件。
要使用文件,首先需要打開文件。PHP fopen()函數(shù)用于打開文件。該函數(shù)的基本語法可以通過以下方式給出:
fopen(filename, mode)
傳遞給fopen()的第一個參數(shù)指定要打開的文件的名稱,第二個參數(shù)指定應以哪種模式打開文件。 例如:
<?php
$handle = fopen("data.txt", "r");
?>測試看看?/?可以通過以下方式之一打開文件:
| 模式 | 它能做什么 |
|---|---|
| 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將生成一條警告消息。因此,為了避免這些錯誤消息,在嘗試訪問某個文件或目錄之前,應該使用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)某種形式的錯誤檢查是一個好習慣,這樣,如果發(fā)生錯誤,您的腳本將可以優(yōu)雅地處理錯誤。請參考有關PHP錯誤處理的教程。
使用完文件后,需要將其關閉。fclose()函數(shù)用于關閉文件,如以下示例所示:
<?php
$file = "data.txt";
//檢查文件是否存在
if(file_exists($file)){
//打開要讀取的文件
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
/* 這里是一些要執(zhí)行的代碼 */
//正在關閉文件句柄
fclose($handle);
} else{
echo "ERROR: File does not exist.";
}
?>測試看看?/?注意:雖然PHP會在腳本終止時自動關閉所有打開的文件,但最好在執(zhí)行所有操作后關閉文件。
現(xiàn)在您已經(jīng)了解了如何打開和關閉文件。 在下一節(jié)中,您將學習如何從文件中讀取數(shù)據(jù)。 PHP有幾個用于從文件讀取數(shù)據(jù)的函數(shù)。 您可以使用單個操作從一個字符讀取整個文件。
fread()函數(shù)可用于從文件中讀取指定數(shù)量的字符??梢允褂么撕瘮?shù)的基本語法。
fread(file handle, length in bytes)
此函數(shù)接受兩個參數(shù)-文件句柄和要讀取的字節(jié)數(shù)。 下面的示例從“data.txt”文件讀取20個字節(jié),包括空格。 假設文件“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");
//關閉文件的句柄
fclose($handle);
//顯示文件內(nèi)容
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>測試看看?/?上面的示例將產(chǎn)生以下輸出:
The quick brown fox
fread()函數(shù)可以與filesize()函數(shù)結合使用,一次讀取整個文件。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));
//正在關閉文件句柄
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ù)組的每個元素對應于文件中的一行。
要處理文件數(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.");
//關閉文件句柄
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ù)的對應功能,提供了一種無需打開即可將數(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)存在,則默認情況下PHP將覆蓋它。如果要保留文件的內(nèi)容,可以將特殊FILE_APPEND標志作為第三個參數(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 "錯誤:文件不存在。";
}
?>在下一章中,我們將學習有關在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ù)。