1、文件處理流程
文件處理流程:
寫入文件流程:
- 打開文件,文件不存在就創(chuàng)建;
- 將數(shù)據(jù)寫入文件;
- 關(guān)閉文件。
讀文件流程: - 打開文件,若文件不能打開,能正確退出;
- 從文件中讀取數(shù)據(jù);
- 關(guān)閉文件。
1.打開文件
fopen(filename,mode,include_path,context)
參數(shù) 描述
filename 必需。規(guī)定要打開的文件或 URL。
mode 必需。規(guī)定要求到該文件/流的訪問類型??赡艿闹狄娤卤怼?include_path 可選。如果也需要在 include_path 中檢索文件的話,可以將該參數(shù)設(shè)為 1 或 TRUE。
context 可選。規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項。
$fp = fopen("$_SERVER['DOCUMENT_ROOT']/html/orders/orders.txt ", "w");
$_SERVER['DOCUMENT_ROOT'] 這個變量指向web服務(wù)器配置的根目錄。D:/php/xampp/htdocs
w 表示寫
fopen()函數(shù)的文件模式
r: 只讀 只讀方式打開,將文件指針指向文件頭;
r+: 只讀 讀寫方式打開,將文件指針指向文件頭;
w: 只寫 寫入方式打開,將文件指針指向文件頭并將文件大小截為0,如果文件不存在嘗試創(chuàng)建之;
w+: 只寫 讀寫方式打開,將文件指針指向文件頭并將文件大小截為0,如果我文件不存在則嘗試創(chuàng)建之;
a: 追加模式 寫入方式打開,將文件指針指向文件末尾,如果文件不存在則嘗試創(chuàng)建之;
a+: 追加模式 讀寫方式打開,將文件指針指向文件末尾,如果文件不存在則嘗試創(chuàng)建之;
x: 謹慎寫 創(chuàng)建并以寫模式打開,將文件指針指向文件頭,若文件已存在,則fopen()調(diào)用失敗并返回false;
x+: 謹慎寫 創(chuàng)建并以讀寫方式打開,并將文件指針指向文件頭,若文件已存在,則fopen()調(diào)用失敗并返回false。
b: 二進制模式,用于與其他模式連接,如:ab
t: 文本 用于與其他模式結(jié)合
2、寫文件
fwrite(fp,string,length) 或 fputs() [fputs()是fwrite()函數(shù)的別名]
該函數(shù)是二進制安全的。(意思是二進制數(shù)據(jù)(如圖像)和字符數(shù)據(jù)都可以使用此函數(shù)寫入。)
參數(shù) 描述
fp 必需。規(guī)定要寫入的打開文件。
string 必需。規(guī)定要寫入文件的字符串。
length 可選。規(guī)定要寫入的最大字節(jié)數(shù)。
-----------------------------------------------------------
$fp = fopen("$_SERVER['DOCUMENT_ROOT']/html/orders/orders.txt ", "ab");
$string = 'abcdefghigklmn';
fwirte($fp, $string);//將$string添加到已打開的文件末尾
當使用二進制模式執(zhí)行寫操作的時候,第3個參數(shù)就可以使用了,他可以幫助我們避免一些跨平臺的兼容問題。
fwrite($fp, $string, strlen($string));
3、關(guān)閉文件fclose();
4、顯示文件內(nèi)容
@ $fp = fopen("$DOCUMENT_ROOT/html/orders/orders.txt", 'rb');
if(! $fp){
echo "<p><strong> Your order could not be processed at this time.
Please try again later.</strong></p></body></html>";
exit;
}
while (!feof($fp)){
$order = fgets($fp, 999);
echo $order."<br />";
}
1. fopen()打開文件,上例中使用了 'rb' 只讀模式
2. feof()[file end of file文件末尾的意思] 判斷何時讀完文件。
feof()的唯一參數(shù)是文件指針,如果文件指針指向了文件末尾,將返回true
3. 每次讀一行數(shù)據(jù):fgets(),fgetss(),fgetcsv()
* fgets($fp,999);不斷讀取數(shù)據(jù),直到讀到一個換行符(\n)或者文件結(jié)束符EOF,或者從文件中讀取了998B??梢宰x取的最大長度為指定的長度減去1B。
* fgetss() 原型為
string fgetss(resource fp, int length, string [allowable_tags]);三個參數(shù)
fgetss()可以過濾字符串中包含的PHP和HTML 標記
* fgetcsv() 原型為
array fgetcsv(fp, [length], [separator], [enclosure])
fp 必需。規(guī)定要檢查的文件。
length 可選。規(guī)定行的最大長度。必須大于 CVS 文件內(nèi)最長的一行。如果忽略(在 PHP 5.0.4 以后的版本中設(shè)為 0)該參數(shù)的話,那么長度就沒有限制,不過可能會影響執(zhí)行效率。
separator 可選。設(shè)置字段分界符(只允許一個字符),默認值為逗號。
enclosure 可選。設(shè)置字段環(huán)繞符(只允許一個字符),默認值為雙引號。
例如 $order = fgetcsv($fp, 100, "\t");讀一行,存在制表符的地方將內(nèi)容分行,返回數(shù)組。
5、讀取整個文件
*readfile(filename, [include_path], [context]);
filename必需。規(guī)定要讀取的文件。
include_path可選。如果也想在 include_path中搜索文件,可以使用該參數(shù)并將其設(shè)為 true。
context可選。規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項。(文件被遠程打開時才使用如通過http)
*fpassthru();使用這個函數(shù)必須先使用fopen()函數(shù)打開文件。返回值為讀取并傳遞到輸出的字符數(shù)目 如果已經(jīng)向文件寫入數(shù)據(jù),就必須調(diào)用 [rewind()]來將文件指針指向文件頭
例子:
$fp = fopen("html/a.txt",'rb');
$fpassthru($fp);
*file(path,[include_path],[context]);與file_get_contents()類似,不同的是 file() 將文件作為一個數(shù)組返回。數(shù)組中的每個單元都是文件中相應(yīng)的一行,包括換行符在內(nèi)
$fileArray = file("$DOCUMENT_ROOT/html/orders/orders.txt");
var_dump($fileArray);
*file_get_contents(path,[include_path],[context],[start],[max_length]) 函數(shù)把整個文件讀入一個字符串中
path 必需。規(guī)定要讀取的文件。
include_path 可選。如果也想在 include_path 中搜尋文件的話,可以將該參數(shù)設(shè)為 "1"。
context 可選。規(guī)定文件句柄的環(huán)境。context 是一套可以修改流的行為的選項。若使用 null,則忽略。
start 可選。規(guī)定在文件中開始讀取的位置。該參數(shù)是 PHP 5.1 新加的。
max_length 可選。規(guī)定讀取的字節(jié)數(shù)。該參數(shù)是 PHP 5.1 新加的。
6、其他讀取文件內(nèi)容的函數(shù)
*一次讀取一個字符:fgetc(handle);
while(!feof($fp)){
$char = fgetc($fp);
if(!feof($fp)){
echo ($char == "\n" ? "<br />":$char);
}
}
*讀取任意字符長度:fread(fp,length);
該函數(shù)將文件讀完或到指定長度停止
7、其他有用的文件函數(shù)
- 查看文件是否存在:
file_exists() - 確定文件大?。?code>filesize()
可以與fread()結(jié)合使用
$fp = fopen("$DOCUMENT_ROOT/html/orders/orders.txt", 'rb');
echo nl2br(fread($fp, filesize("$DOCUMENT_ROOT/html/orders/orders.txt")));
fclose($fp);
*
nl2br();函數(shù)將"\n"字符轉(zhuǎn)換為html的"<br />"
- 刪除文件:
unlink(filename)失敗返回值為false - 在文件中定位:
rewind(),fseek(),ftell()
rewind();函數(shù)將文件指針復(fù)位到文件的開始位置;
ftell();函數(shù)以字節(jié)為單位報告文件指針當前在文件中的位置;
fseek(fp,offset,[whence]);
fp必需。規(guī)定要在其中定位的文件。
offset必需。規(guī)定新的位置(從文件頭開始以字節(jié)數(shù)度量)。
whence可選。可能的值:
SEEK_SET - 設(shè)定位置等于 offset 字節(jié)。默認。
SEEK_CUR - 設(shè)定位置為當前位置加上 offset。
SEEK_END - 設(shè)定位置為文件末尾加上 offset(要移動到文件尾之前的位置,offset 必須是一個負值)
- 文件鎖定
flock()
flock(file,lock,[block])//意義不大,用數(shù)據(jù)庫解決問題比較好,用著的時候百度下用處即可
以上介紹這些文件操作,在現(xiàn)實中其實意義不大。
1.并發(fā)問題無法解決;
2.文件變大的,處理起來將會非常緩慢;
3.查找不方便;
4.增刪改查極不方便;
5.插入或刪除時將文件讀入內(nèi)存中將帶來極大的開銷;
6.訪問權(quán)限問題無法解決。