PHP文件操作
像其他編程語言(c , java)一樣螟蝙,php內(nèi)置了多個(gè)文件函數(shù),用來完成文件的打開、讀寫玄坦、關(guān)閉等操作嫩挤。
1.打開文件
resource fopen(string $filename,string mode,[,bool $use_include_path=false[,resource context]] )
fopen函數(shù)用于打開一個(gè)已存在的文件害幅,如果文件不存在或打開失敗,返回false岂昭,可以在前面加@來屏蔽這個(gè)錯(cuò)誤矫限;如果正確打開,返回文件指針句柄佩抹。
fopen支持多種模式:
模式 | 模式名稱 | 意義 |
---|---|---|
r | 只讀 | 打開文件叼风,從文件頭開始讀 |
r+ | 讀寫 | 打開文件,從文件頭開始讀寫 |
w | 只寫 | 打開文件棍苹,從文件頭開始寫无宿,若文件存在會(huì)刪除原有內(nèi)容,若文件不存在枢里,會(huì)創(chuàng)建這個(gè)文件 |
w+ | 讀寫 | 打開文件孽鸡,從文件頭開始讀寫蹂午,若文件存在會(huì)刪除原有內(nèi)容,若文件不存在彬碱,會(huì)創(chuàng)建這個(gè)文件 |
x | 謹(jǐn)慎寫 | 打開文件豆胸,從文件頭開始寫,若文件存在巷疼,返回false晚胡,若文件不存在,會(huì)創(chuàng)建這個(gè)文件 |
x+ | 謹(jǐn)慎讀寫 | 打開文件嚼沿,從文件頭開始讀寫估盘,若文件存在,返回false骡尽,若文件不存在遣妥,會(huì)創(chuàng)建這個(gè)文件 |
a | 追加寫 | 打開文件,如果文件已有內(nèi)容攀细,在文件尾追加寫箫踩,若文件不存在,會(huì)創(chuàng)建這個(gè)文件 |
a+ | 追加讀寫 | 打開文件谭贪,如果文件已有內(nèi)容班套,在文件尾追加讀寫,若文件不存在故河,會(huì)創(chuàng)建這個(gè)文件 |
b | 二進(jìn)制 | 二進(jìn)制模式吱韭,用于和其它模式連接。windows區(qū)分二進(jìn)制文件和文本文件鱼的,而Unix不區(qū)分理盆,推薦使用這個(gè)選項(xiàng)達(dá)到兼容性 |
t | 文本 | 文本模式,用于和其它模式連接凑阶,只是windows系統(tǒng)下的一個(gè)選項(xiàng) |
2.寫文件
php中寫文件函數(shù)為fwrite()猿规,同樣可以用fputs()函數(shù),它是fwrite的別名函數(shù)宙橱。
int fwrite($fp, $outputstring,[,int length])
$fp是fopen函數(shù)返回的文件句柄姨俩,$outputstring是要寫入文件的字符串。length是寫入的長(zhǎng)度师郑。寫入成功返回寫入的字節(jié)數(shù)环葵,失敗返回false。
此外宝冕,可以使用file_put_contents函數(shù)來寫文件张遭,它的效果和依次調(diào)用fopen,fwrite,fclose的效果一樣,也就是說不需要調(diào)用fopen函數(shù)就可以寫入數(shù)據(jù)到文件地梨。
int file_put_contens(string filename,string data,[,int flags[,resource context]])
該函數(shù)返回寫入文件的字節(jié)數(shù)菊卷,失敗返回false缔恳。
3.讀文件
讀文件有多種方式,根據(jù)需求可能按行讀取洁闰,可能按字節(jié)讀取歉甚,也可能整個(gè)文件讀取。按行讀取和按字節(jié)讀取需要用feof函數(shù)檢測(cè)文件末尾扑眉。
bool feof(resource $handle)
$handle是fopen函數(shù)返回的句柄纸泄,若文件達(dá)到末尾EOF(end of file)或出錯(cuò)返回true,否則返回false襟雷。
-
每次讀取一行數(shù)據(jù)
讀取一行數(shù)據(jù)可以用fgets刃滓、fgetss仁烹、fgetcsv函數(shù)耸弄。
string fgets(resource $handle, [,int length])
$handle是fopen函數(shù)返回的句柄,length默認(rèn)長(zhǎng)度為1024字節(jié)卓缰,如果指定了length參數(shù)计呈,那么每行最多讀取并返回length個(gè)字節(jié)。
string fgetss(resource $handle,[,int length[,string $allowable_tags]])
和fgets相似征唬,只是fgetss會(huì)去掉任何HTML和PHP標(biāo)記捌显。$handle是fopen函數(shù)返回的句柄,length指定每行的字節(jié)數(shù)总寒,$allowable_tags指定哪些標(biāo)記不被去掉扶歪。
array fgetcsv(resource $handle,[,int length=0[,string delimiter=','[,string enclosure='"'[,string escape='\\']]]])
和fgets類似,只是除了讀出的每一行并找出 CSV格式的字段然后返回一個(gè)包含這些字段的數(shù)組摄闸。
-
每次讀取一個(gè)字符
讀取一個(gè)字符使用fgetc函數(shù)實(shí)現(xiàn)善镰。
string fgetc(resource $handle)
$handle是fopen函數(shù)返回的句柄。fgetc會(huì)返回文件結(jié)束符EOF年枕,而fgets不會(huì)炫欺,因此讀取字符時(shí)需要判斷是不是EOF,一般情況下不希望顯示EOF熏兄。
-
讀取整個(gè)文件
讀取整個(gè)文件可以用readfile品洛、fpassthru、file函數(shù)摩桶。
int readfile(string $filename,[,bool $use_include_path=false[,resource $context]])
調(diào)用readfile會(huì)打開文件桥状,并將文件內(nèi)容輸出到標(biāo)準(zhǔn)輸出(瀏覽器)中,然后關(guān)閉這個(gè)文件硝清。讀取成功返回讀入的文件字節(jié)數(shù)岛宦,失敗返回false。
int fpassthru(resource $handle)
這和readfile類似耍缴,只是需要先調(diào)用fopen函數(shù)打開砾肺,然后將文件句柄傳入這個(gè)函數(shù)挽霉,結(jié)果將文件內(nèi)容輸出到標(biāo)準(zhǔn)輸出,最后關(guān)閉文件变汪。
array file(string $filename,[,int flags=0[,resource $context]])
file函數(shù)除了可以將文件內(nèi)容回顯到標(biāo)準(zhǔn)輸出外侠坎,它將文件的每一行返回到一個(gè)數(shù)組中。
string file_get_contents(string $filename,[,bool $use_include_path=false[,resource $context[,int $offset=-1[,int $maxlen]]]])
和file_put_contents相反裙盾,file_get_contents將整個(gè)文件內(nèi)容讀入到一個(gè)字符串中实胸,并且不會(huì)將文件內(nèi)容輸出到標(biāo)準(zhǔn)輸出中。
-
讀取任意長(zhǎng)度
可以使用fread函數(shù)從文件中讀取任意長(zhǎng)度的字節(jié)番官。
string fread(resource $handle, int length)
成功返回讀取的字符串庐完,失敗返回false。
4.關(guān)閉文件
當(dāng)用fopen打開一個(gè)文件徘熔,使用完這個(gè)文件之后(讀寫)需要將其關(guān)閉门躯,關(guān)閉一個(gè)文件調(diào)用fclose函數(shù)實(shí)現(xiàn)。
bool fclose(resource $handle)
若文件成功關(guān)閉返回true酷师,反之返回false讶凉。
5.文件鎖定
為了避免多個(gè)用戶同時(shí)讀寫一個(gè)文件,引起資源競(jìng)爭(zhēng)導(dǎo)致不可預(yù)知的結(jié)果山孔,往往需要在打開一個(gè)文件后給它加鎖懂讯。文件鎖定使用flock函數(shù)實(shí)現(xiàn)
bool flock(resource $handle,int $operation [,int &$wouldblock])
文件加鎖操作默認(rèn)是阻塞模式,可以設(shè)置模式為L(zhǎng)OCK_NB來取消阻塞台颠。支持的模式包括如下:
模式 | 意義 |
---|---|
LOCK_SH | 讀操作鎖定褐望,文件共享,其他人可以讀該文件 |
LOCK_EX | 寫操作鎖定串前,文件互斥瘫里,該文件不能共享 |
LOCK_UN | 釋放已有的鎖定 |
LOCK_NB | 防止在請(qǐng)求加鎖時(shí)發(fā)生阻塞 |
6.其他文件相關(guān)函數(shù)
-
file_exists
在不打開文件的前提下,使用file_exists函數(shù)檢查這個(gè)文件是否存在酪呻,它也可以檢查一個(gè)目錄是否存在减宣。
bool file_exists(string $filename)
-
filesize
使用filesize函數(shù)來檢測(cè)一個(gè)文件的大小。
int filesize(string $filename)
-
unlink
使用unlink刪除一個(gè)文件
bool unlink(string $filename,[,resource $context])
-
rewind fseek ftell
這三個(gè)是文件定位函數(shù)玩荠,可以對(duì)文件指針進(jìn)行操作漆腌。rewind函數(shù)在文件指針復(fù)位到文件開始,ftell函數(shù)返回當(dāng)前文件指針?biāo)诘淖止?jié)數(shù)位置阶冈,fseek用于將文件指針指向文件的某個(gè)位置闷尿。
bool rewind(resource $handle, int $offset,[,int $whence=SEEK_SET] )
int fseek()
int ftell(resource $handle)