PHP文件處理
PHP 擁有的多種函數(shù)可供創(chuàng)建、讀取、上傳以及編輯文件。
注意:請(qǐng)謹(jǐn)慎操作文件!
當(dāng)您操作文件時(shí)必須非常小心。如果您操作失誤,可能會(huì)造成非常嚴(yán)重的破壞。
常見的錯(cuò)誤是:
? 1.編輯錯(cuò)誤的文件
? 2.被垃圾數(shù)據(jù)填滿硬盤
? 3. 意外刪除文件內(nèi)容
PHP readfile()函數(shù)
readfile($文件名)?
功能:傳入一個(gè)文件路徑,輸出一個(gè)文件
例如 有個(gè)名為file.txt 的文件,內(nèi)容如下
??Welcome in the PHP Chinese learning PHP
?用readfile()函數(shù)讀取此文件并寫到輸出流的 PHP 代碼如下(如讀取成功則 readfile() 函數(shù)返回字節(jié)數(shù)):
?字節(jié)數(shù):英文占一個(gè)字節(jié)? gbk編碼中文占2個(gè)? utf-8中文占3個(gè)? 空格和符號(hào)占1個(gè)
<?php echo readfile("D:WWW/item/file.txt"); ?>
程序運(yùn)行結(jié)果:
Welcome in the PHP Chinese learning PHP39
file_get_contents打開文件
上面的是單純打文件就直接輸出了,有沒有打開文件后,能夠賦值給一個(gè)變量的操作方式呢。
PHP當(dāng)然會(huì)提供這種方式。這個(gè)方式就是PHP打開文件并返回內(nèi)容的方式之一,我們來看看函數(shù):
file_get_contents ( string filename)
功能:傳入一個(gè)文件或文件路徑,打開這個(gè)文件返回文件的內(nèi)容。文件的內(nèi)容是一個(gè)字符串。
例如? 有個(gè)file.txt 的文件,內(nèi)容如下:
?I use the file_get_contents open
使用 file_get_contents 打開
<?php $fileName="file.txt"; $filestring = file_get_contents($fileName); echo $filestring; ?>
程序運(yùn)行結(jié)果:
?I use the file_get_contents open
?
fopen、fread、fclose操作讀取文件
fopen ($文件名, 模式)
fread ($操作資源, 讀取長(zhǎng)度)
fclose ($操作資源 )
通過上面的函數(shù)我們來講解資源類型的通常操作方式:
1.? 打開資源
2.? 使用相關(guān)函數(shù)進(jìn)行操作
3.? 關(guān)閉資源
fopen函數(shù) fopen函數(shù)的功能是打開文件,參數(shù)主要有兩個(gè):
1. ?文件打開的路徑
2. ?打開文件的模式
? ? ?資源類型需要其他的函數(shù)來操作這個(gè)資源。所有的資源有打開就要有關(guān)閉。
fread函數(shù) 函數(shù)的功能的功能是讀取打開的文件資源。讀取指定長(zhǎng)度的文件資源,讀取一部份向后移動(dòng)一部份。至到文件結(jié)尾。
fclose函數(shù) fclose函數(shù)的功能是關(guān)閉資源。資源有打開就有關(guān)閉。
?fopen的模式(下表):
? ? ? ? ?模式 | ? ? ? ? ? 說明 |
r | 只讀。在文件的開頭開始。 |
r+ | 讀/寫。在文件的開頭開始。 |
w | 只寫。打開并清空文件的內(nèi)容;如果文件不存在,則創(chuàng)建新文件。 |
? ?? w+ | 讀/寫。打開并清空文件的內(nèi)容;如果文件不存在,則創(chuàng)建新文件。 |
? ? ? a | 追加。打開并向文件末尾進(jìn)行寫操作,如果文件不存在,則創(chuàng)建新文件。 |
a+ | 讀/追加。通過向文件末尾寫內(nèi)容,來保持文件內(nèi)容。 |
? ? x | 只寫。創(chuàng)建新文件。如果文件已存在,則返回 FALSE 和一個(gè)錯(cuò)誤。 |
?? x+ | 讀/寫。創(chuàng)建新文件。如果文件已存在,則返回 FALSE 和一個(gè)錯(cuò)誤。 |
t | windows下將n轉(zhuǎn)為rn |
? ? ?b | 二進(jìn)制打開模式 |
1.打開文件
file.txt 文件的內(nèi)容如下
You're welcome
<?php //你可以創(chuàng)建一個(gè)file.txt,以只讀模式打開 $fp = fopen('file.txt', "r"); //var_dump()操作一下$fp看看效果,輸出的是不是只有類型提示的是resource var_dump($fp); ?>
2.讀取文件
<?php $fp = fopen('file.txt', "r"); //打開一個(gè)文件類型后,讀取12個(gè)字節(jié) $contents = fread($fp, 12); ?>
?3,關(guān)閉文件
<?php $fp = fopen('file.txt', 'r'); $contents = fread($fp, 1024); fclose($fp); echo $contents; ?>
程序運(yùn)行結(jié)果:
?You're welcome
file_put_contents和fwrite寫入文件
??file_put_contents ( string $文件路徑, string $寫入數(shù)據(jù)])
?功能:向指定的文件當(dāng)中寫入一個(gè)字符串,如果文件不存在則創(chuàng)建文件。返回的是寫入的字節(jié)長(zhǎng)度
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $data = "我是一個(gè)兵,來自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '寫入成功,我們讀取看看結(jié)果試試:'; echo file_get_contents('binggege.txt'); }else{ echo '寫入失敗或者沒有權(quán)限,注意檢查'; } ?>
程序運(yùn)行結(jié)果:
?寫入成功,我們讀取看看結(jié)果試試:我是一個(gè)兵,來自老百姓
fwrite ( resource $文件資源變量, string $寫入的字符串 [, int 長(zhǎng)度])
?? 注:fwrite的別名函數(shù)是fputs
我們上面試了r模式,只道是讀取的時(shí)候使用,接下來我們用fwrite加上fopen中的w,寫入模式來進(jìn)行文件寫入
實(shí)例
你可以試試新建個(gè)test.txt文件向里面寫入內(nèi)容。然后,可以試試把test.txt刪除??纯从惺裁刺崾?。
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'test.txt'; $fp= fopen($filename, "w"); $len = fwrite($fp, '我是一只來自南方的狼,一直在尋找心中的花姑娘'); fclose($fp); print $len ."字節(jié)被寫入了\n"; ?>
程序運(yùn)行結(jié)果:
66字節(jié)被寫入了
總結(jié):
1.不論有沒有新建都會(huì)打開文件重新寫入
2.原有的文件內(nèi)容會(huì)被覆蓋掉
3.文件不存在會(huì)創(chuàng)建
對(duì)比一下以下幾個(gè)模式的不同:
模式 | 說明 |
r | 只能讀不能使用fwrite寫 |
r+ | 可操作讀、寫 |
w | 只可以寫功能 |
w+ | 即可讀又可以寫 |
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'test.txt'; $fp= fopen($filename, "r"); $len = fwrite($fp, '我是一只來自南方的狼,一直在尋找心中的花姑娘'); fclose($fp); print $len .'字節(jié)被寫入了\n'; ?>
程序運(yùn)行結(jié)果:
?0字節(jié)被寫入了n
我們發(fā)現(xiàn)只用 r 的話 寫入是不成功的
創(chuàng)建臨時(shí)文件
我們之前創(chuàng)建的文件都是永久文件。
而創(chuàng)建臨時(shí)文件在我們平時(shí)的項(xiàng)目開發(fā)中也非常有用。創(chuàng)建臨時(shí)文件的幾個(gè)好處
1.??? 用完后即刪除
2.??? 不需要去維護(hù)這個(gè)文件的刪除狀態(tài)
例如:我需要把A的文件內(nèi)容轉(zhuǎn)存B里面,把B的文件內(nèi)容轉(zhuǎn)存到C里面。
就跟現(xiàn)實(shí)生活中一樣,我可以先用一個(gè)臨時(shí)的瓶子把B的水裝起來,然后把A的數(shù)據(jù)寫入到B里面。把臨時(shí)瓶子的水追加到C里面。
我們來學(xué)習(xí)一下這個(gè)函數(shù):
resource tmpfile ( )
功能:創(chuàng)建一個(gè)臨時(shí)文件,返回資源類型。關(guān)閉文件即被刪除。
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $handle = tmpfile(); //向里面寫入了數(shù)據(jù) $numbytes = fwrite($handle, '寫入臨時(shí)文件的內(nèi)容'); //關(guān)閉臨時(shí)文件,文件即被刪除 fclose($handle); echo '向臨時(shí)文件中寫入了'.$numbytes . '個(gè)字節(jié)'; ?>
程序運(yùn)行結(jié)果:
向臨時(shí)文件中寫入了27個(gè)字節(jié)
移動(dòng),拷貝,刪除文件
重命名文件
rename($舊名,$新名);
這個(gè)函數(shù)返回一個(gè)bool值,將舊的名字改為新的名字。
實(shí)例
<?php $fileName1="text.txt"; $fileName2="text--1.txt"; rename($fileName1,$fileName2); ?>
上面的例子就是將一個(gè)text.txt的文件 改名為text--1.txt 的例子,你不妨可以試下
復(fù)制文件
?copy(源文件,目標(biāo)文件)
功能:將指定路徑的源文件,復(fù)制一份到目標(biāo)文件的位置。
實(shí)例
<?php $filename = 'file.txt'; //舊文件名 $filename2 = 'copy-file.txt'; //新文件名 copy($filename, $filename2); //修改名字。 ?>
上面的例子是將一個(gè)文件名為 file.txt的文件,復(fù)制一份名為 copy-file.txt 的文件,內(nèi)容一樣。
刪除文件
?unlink (指定路徑的文件)
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'test.txt'; unlink($filename); ?>
上面的例子是將一個(gè)文件名為 test.txt的文件刪除
文件常用的函數(shù)
filesize 檢測(cè)文件的大小
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'file.txt'; echo $filename . '文件大小為: ' . filesize($filename) . ' bytes'; ?>
程序運(yùn)行結(jié)果:
file.txt文件大小為: 14 bytes
其他操作文件的函數(shù),讀取文件
函數(shù)名 | 功能 |
file | 把整個(gè)文件讀入一個(gè)數(shù)組中 |
fgets | 從文件指針中讀取一行,讀到最后返回false |
fgetc | 從文件指針中讀取一個(gè)字符,讀到最后返回false |
ftruncate | 將文件截?cái)嗟浇o定的長(zhǎng)度 |
我們通過一個(gè)實(shí)例來把上面幾個(gè)函數(shù)都用到。
我們?cè)趖ext.txt文件中寫入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
fgetc每次讀取一個(gè)
<?php //以增加的r模式打開 $fp = fopen('text.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgetc($fp) ."<br>"; //我要全部讀取可以,讀取一次將結(jié)果賦值一次給$string while($string = fgetc($fp)){ echo $string; } ?>
程序運(yùn)行結(jié)果:
?a
bcdeefghijklk opqrst uvwxyz 12345678
fgets每次打開一行:
<?php //以增加的r模式打開 $fp = fopen('text.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgets($fp)."<br>"; echo fgets($fp)."<br>"; echo fgets($fp)."<br>"; echo fgets($fp); ?>
程序運(yùn)行結(jié)果:
abcdeefghijklk
opqrst
uvwxyz
12345678
文件截取函數(shù)
<?php //打開我們上面的text.txt文件 $file = fopen("text.txt", "a+"); //你可以數(shù)數(shù)20個(gè)字有多長(zhǎng),看看是不是達(dá)到效果了 echo ftruncate($file,10); fclose($file); ?>
運(yùn)行一下程序,可以打開text.txt 文件,看一下是不是有20的字節(jié)
文件的時(shí)間函數(shù)
? ? 函數(shù) | ? ?功能說明 |
? ? filectime | ??文件創(chuàng)建時(shí)間 |
? ??filemtime | ? 文件修改時(shí)間 |
? ??fileatime | ??文件上次訪問時(shí)間 |
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'text.txt'; if (file_exists($filename)) { echo "$filename"."文件的上次訪問時(shí)間是: " . date("Y-m-d H:i:s", fileatime($filename))."<br>"; echo "$filename"."文件的創(chuàng)建時(shí)間是: " . date("Y-m-d H:i:s", filectime($filename))."<br>"; echo "$filename"."文件的修改時(shí)間是: " . date("Y-m-d H:i:s", filemtime($filename)); } ?>
程序運(yùn)行結(jié)果:
text.txt文件的上次訪問時(shí)間是: 2016-09-13 17:44:40
text.txt文件的創(chuàng)建時(shí)間是: 2016-09-13 17:32:16
text.txt文件的修改時(shí)間是: 2016-09-13 17:44:55
目錄處理函數(shù)
之前我們處理的全都是文件,那目錄和文件夾怎么處理呢?
我們就來學(xué)習(xí)目錄或者稱為文件夾的處理相關(guān)函數(shù)。
處理文件夾的基本思想如下:
1.??? 讀取某個(gè)路徑的時(shí)候判斷是否是文件夾
2.??? 是文件夾的話,打開指定文件夾,返回文件目錄的資源變量
3.??? 使用readdir讀取一次目錄中的文件,目錄指針向后偏移一次
4.??? 使用readdir讀取到最后,沒有可讀的文件返回false
5.??? 關(guān)閉文件目錄
我們來學(xué)習(xí)一下比較常用函數(shù):
? ? ? 函數(shù)名 | ? ? ? ?功能 |
opendir | 打開文件夾,返回操作資源 |
readdir | 讀取文件夾資源 |
is_dir | 判斷是否是文件夾 |
closedir | 關(guān)閉文件夾操作資源 |
filetype | 顯示是文件夾還是文件,文件顯示file,文件夾顯示dir |
實(shí)例
<?php //設(shè)置打開的目錄是D盤 $dir = "D:/"; //判斷是否是文件夾,是文件夾 if (is_dir($dir)) { if ($dh = opendir($dir)) { //讀取一次向后移動(dòng)一次文件夾指針 echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; //讀取到最后返回false //關(guān)閉文件夾資源 closedir($dh); } } ?>
可以運(yùn)行一下程序,看看是不是你電腦D盤的目錄
判斷文件的類型
<?php //設(shè)置打開的目錄是D盤 $dir = "D:/"; //判斷是否是文件夾,是文件夾 if (is_dir($dir)) { if ($dh = opendir($dir)) { //讀取到最后返回false,停止循環(huán) while (($file = readdir($dh)) !== false) { echo "文件名為: $file : 文件的類型是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
運(yùn)行程序看看
文件路徑函數(shù)
我們經(jīng)常會(huì)遇到處理文件路徑的情況。
例如:
1.??? 文件后綴需要取出來
2.??? 路徑需要取出名字不取目錄
3.??? 只需要取出路徑名中的目錄路徑
4.??? 或者把網(wǎng)址中的各個(gè)部份進(jìn)行解析取得獨(dú)立值
5. ? ?甚至是自己組成一個(gè)url出來
很多地方都需要用路徑處理類的函數(shù)。
我們把常用的路徑處理函數(shù)為大家做了標(biāo)注,大家對(duì)著這個(gè)路徑處理函數(shù)進(jìn)行處理即可:
? ? ?函數(shù)名 | ? ? ? 功能 |
pathinfo | 返回文件的各個(gè)組成部份 |
basename | 返回文件名 |
? ? dirname | 文件目錄部份 |
? ? parse_url | ?網(wǎng)址拆解成各部份 |
? ?http_build_query | 生成url 中的query字符串 |
? ?http_build_url | 生成一個(gè)url |
pathinfo
?pathinfo ( string $路徑)
功能:傳入文件路徑返回文件的各個(gè)組成部份
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); $path_parts = pathinfo('D:/www/a.html'); echo '文件目錄名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件擴(kuò)展名:'.$path_parts['extension']."<br />"; echo '不包含擴(kuò)展的文件名:'.$path_parts['filename']."<br />"; ?>
程序運(yùn)行結(jié)果:
文件目錄名:D:/www
文件全名:a.html
文件擴(kuò)展名:html
不包含擴(kuò)展的文件名:a
basename
basename ( string $路徑[, string $suffix ])
功能:傳入路徑返回文件名
第一個(gè)參數(shù)傳入路徑。
第二個(gè)參數(shù),指定我文件名到了指定字符停止。
實(shí)例
<?php echo "1: ".basename("d:/www/a.html", ".d")."<br>"; echo "2: ".basename("d:/www/include")."<br>"; echo "3: ".basename("d:/www/text.txt")."<br>"; ?>
程序運(yùn)行結(jié)果:
?1: a.html
?2: include
?3: text.txt
dirname
dirname(string $路徑)?
功能:返回文件路徑的文件目錄部份
實(shí)例
<?php $a=dirname(__FILE__); echo$a; ?>
運(yùn)行一下你的程序
parse_url
?parse_url ( string $路徑 )
功能:將網(wǎng)址拆解成各個(gè)部份
實(shí)例
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
程序運(yùn)行結(jié)果:
?array(8) {
? ["scheme"]=>
? string(4) "http"
? ["host"]=>
? string(8) "hostname"
? ["port"]=>
? int(9090)
? ["user"]=>
? string(8) "username"
? ["pass"]=>
? string(8) "password"
? ["path"]=>
? string(5) "/path"
? ["query"]=>
? string(9) "arg=value"
? ["fragment"]=>
? string(6) "anchor"
}
http_build_query
http_build_query ( mixed $需要處理的數(shù)據(jù))
功能:生成url 中的query字符串
實(shí)例
<?php //定義一個(gè)關(guān)聯(lián)數(shù)組 $data = [ 'username'=>'liwenkai', 'area'=>'hubei', 'pwd'=>'123' ]; //生成query內(nèi)容 echo http_build_query($data); ?>
程序運(yùn)行結(jié)果:
username=liwenkai&area=hubei&pwd=123
PHP Filesystem 參考手冊(cè)
如需查看 PHP 文件系統(tǒng)函數(shù)的完整參考手冊(cè),請(qǐng)?jiān)L問我們的PHP Filesystem 參考手冊(cè)。