PHP文件操作
像其他編程語言(c , java)一樣,php內置了多個文件函數,用來完成文件的打開、讀寫、關閉等操作。
1.打開文件
resource fopen(string $filename,string mode,[,bool $use_include_path=false[,resource context]] )
fopen函數用于打開一個已存在的文件,如果文件不存在或打開失敗,返回false,可以在前面加@來屏蔽這個錯誤;如果正確打開,返回文件指針句柄。
fopen支持多種模式:
模式 | 模式名稱 | 意義 |
---|---|---|
r | 只讀 | 打開文件,從文件頭開始讀 |
r+ | 讀寫 | 打開文件,從文件頭開始讀寫 |
w | 只寫 | 打開文件,從文件頭開始寫,若文件存在會刪除原有內容,若文件不存在,會創建這個文件 |
w+ | 讀寫 | 打開文件,從文件頭開始讀寫,若文件存在會刪除原有內容,若文件不存在,會創建這個文件 |
x | 謹慎寫 | 打開文件,從文件頭開始寫,若文件存在,返回false,若文件不存在,會創建這個文件 |
x+ | 謹慎讀寫 | 打開文件,從文件頭開始讀寫,若文件存在,返回false,若文件不存在,會創建這個文件 |
a | 追加寫 | 打開文件,如果文件已有內容,在文件尾追加寫,若文件不存在,會創建這個文件 |
a+ | 追加讀寫 | 打開文件,如果文件已有內容,在文件尾追加讀寫,若文件不存在,會創建這個文件 |
b | 二進制 | 二進制模式,用于和其它模式連接。windows區分二進制文件和文本文件,而Unix不區分,推薦使用這個選項達到兼容性 |
t | 文本 | 文本模式,用于和其它模式連接,只是windows系統下的一個選項 |
2.寫文件
php中寫文件函數為fwrite(),同樣可以用fputs()函數,它是fwrite的別名函數。
int fwrite($fp, $outputstring,[,int length])
$fp是fopen函數返回的文件句柄,$outputstring是要寫入文件的字符串。length是寫入的長度。寫入成功返回寫入的字節數,失敗返回false。
此外,可以使用file_put_contents函數來寫文件,它的效果和依次調用fopen,fwrite,fclose的效果一樣,也就是說不需要調用fopen函數就可以寫入數據到文件。
int file_put_contens(string filename,string data,[,int flags[,resource context]])
該函數返回寫入文件的字節數,失敗返回false。
3.讀文件
讀文件有多種方式,根據需求可能按行讀取,可能按字節讀取,也可能整個文件讀取。按行讀取和按字節讀取需要用feof函數檢測文件末尾。
bool feof(resource $handle)
$handle是fopen函數返回的句柄,若文件達到末尾EOF(end of file)或出錯返回true,否則返回false。
-
每次讀取一行數據
讀取一行數據可以用fgets、fgetss、fgetcsv函數。
string fgets(resource $handle, [,int length])
$handle是fopen函數返回的句柄,length默認長度為1024字節,如果指定了length參數,那么每行最多讀取并返回length個字節。
string fgetss(resource $handle,[,int length[,string $allowable_tags]])
和fgets相似,只是fgetss會去掉任何HTML和PHP標記。$handle是fopen函數返回的句柄,length指定每行的字節數,$allowable_tags指定哪些標記不被去掉。
array fgetcsv(resource $handle,[,int length=0[,string delimiter=','[,string enclosure='"'[,string escape='\\']]]])
和fgets類似,只是除了讀出的每一行并找出 CSV格式的字段然后返回一個包含這些字段的數組。
-
每次讀取一個字符
讀取一個字符使用fgetc函數實現。
string fgetc(resource $handle)
$handle是fopen函數返回的句柄。fgetc會返回文件結束符EOF,而fgets不會,因此讀取字符時需要判斷是不是EOF,一般情況下不希望顯示EOF。
-
讀取整個文件
讀取整個文件可以用readfile、fpassthru、file函數。
int readfile(string $filename,[,bool $use_include_path=false[,resource $context]])
調用readfile會打開文件,并將文件內容輸出到標準輸出(瀏覽器)中,然后關閉這個文件。讀取成功返回讀入的文件字節數,失敗返回false。
int fpassthru(resource $handle)
這和readfile類似,只是需要先調用fopen函數打開,然后將文件句柄傳入這個函數,結果將文件內容輸出到標準輸出,最后關閉文件。
array file(string $filename,[,int flags=0[,resource $context]])
file函數除了可以將文件內容回顯到標準輸出外,它將文件的每一行返回到一個數組中。
string file_get_contents(string $filename,[,bool $use_include_path=false[,resource $context[,int $offset=-1[,int $maxlen]]]])
和file_put_contents相反,file_get_contents將整個文件內容讀入到一個字符串中,并且不會將文件內容輸出到標準輸出中。
-
讀取任意長度
可以使用fread函數從文件中讀取任意長度的字節。
string fread(resource $handle, int length)
成功返回讀取的字符串,失敗返回false。
4.關閉文件
當用fopen打開一個文件,使用完這個文件之后(讀寫)需要將其關閉,關閉一個文件調用fclose函數實現。
bool fclose(resource $handle)
若文件成功關閉返回true,反之返回false。
5.文件鎖定
為了避免多個用戶同時讀寫一個文件,引起資源競爭導致不可預知的結果,往往需要在打開一個文件后給它加鎖。文件鎖定使用flock函數實現
bool flock(resource $handle,int $operation [,int &$wouldblock])
文件加鎖操作默認是阻塞模式,可以設置模式為LOCK_NB來取消阻塞。支持的模式包括如下:
模式 | 意義 |
---|---|
LOCK_SH | 讀操作鎖定,文件共享,其他人可以讀該文件 |
LOCK_EX | 寫操作鎖定,文件互斥,該文件不能共享 |
LOCK_UN | 釋放已有的鎖定 |
LOCK_NB | 防止在請求加鎖時發生阻塞 |
6.其他文件相關函數
-
file_exists
在不打開文件的前提下,使用file_exists函數檢查這個文件是否存在,它也可以檢查一個目錄是否存在。
bool file_exists(string $filename)
-
filesize
使用filesize函數來檢測一個文件的大小。
int filesize(string $filename)
-
unlink
使用unlink刪除一個文件
bool unlink(string $filename,[,resource $context])
-
rewind fseek ftell
這三個是文件定位函數,可以對文件指針進行操作。rewind函數在文件指針復位到文件開始,ftell函數返回當前文件指針所在的字節數位置,fseek用于將文件指針指向文件的某個位置。
bool rewind(resource $handle, int $offset,[,int $whence=SEEK_SET] )
int fseek()
int ftell(resource $handle)