PHP檔案處理
PHP 擁有的多種函數(shù)可供建立、讀取、上傳以及編輯檔案。
注意:請(qǐng)謹(jǐn)慎操作檔案!
當(dāng)您操作文件時(shí)必須非常小心。如果您操作失誤,可能會(huì)造成非常嚴(yán)重的破壞。
常見(jiàn)的錯(cuò)誤是:
? 1.編輯錯(cuò)誤的檔案
? 2.被垃圾資料填滿硬碟
? 3.意外刪除檔案內(nèi)容
PHP readfile()函數(shù)
##readfile
($檔名)?
#功能:傳入一個(gè)檔案路徑,輸出一個(gè)檔案
例如有個(gè)名為file.txt 的文件,內(nèi)容如下?
?Welcome in the PHP Chinese learning PHP?
用readfile()函數(shù)讀取此檔案並寫(xiě)入輸出流的PHP 程式碼如下(如讀取成功則readfile() 函數(shù)傳回位元組數(shù)):
?位元組數(shù):英文佔(zhàn)一個(gè)位元組? gbk編碼中文佔(zhàn)2個(gè)? utf-8中文佔(zhàn)3個(gè)? 空格和符號(hào)佔(zhàn)1個(gè)
<?php
echo readfile("D:WWW/item/file.txt");
?>
程式運(yùn)作結(jié)果:
file_get_contents開(kāi)啟檔案
上面的是單純打文件就直接輸出了,有沒(méi)有開(kāi)啟檔案後,能夠賦值給一個(gè)變數(shù)的操作方式呢。 PHP當(dāng)然會(huì)提供這種方式。這個(gè)方式就是PHP開(kāi)啟檔案並回傳內(nèi)容的方式之一,讓我們來(lái)看看函數(shù):
file_get_contents## ( string filename)
#功能:傳入一個(gè)檔案或檔案路徑,開(kāi)啟這個(gè)檔案回傳檔案的內(nèi)容。文件的內(nèi)容是一個(gè)字串。###?###I use the file_get_contents open###### ############使用file_get_contents 開(kāi)啟#########例如? 有個(gè)file.txt 的文件,內(nèi)容如下:
<?php $fileName="file.txt"; $filestring = file_get_contents($fileName); echo $filestring; ?>#########程式執(zhí)行結(jié)果:############ I use the file_get_contents open############?###
fopen、fread、fclose操作讀取檔案
#fopen ($檔名, 模式)
fread($操作資源, 讀取長(zhǎng)度)
fclose ($操作資源)透過(guò)上面的函數(shù)我們來(lái)講解資源類型的通常操作方式:##1.? 開(kāi)啟資源
2.? 使用相關(guān)函數(shù)操作
#3.? 關(guān)閉資源
fopen
#函數(shù)fopen函數(shù)的功能是開(kāi)啟文件,參數(shù)主要有兩個(gè):1. ?檔案開(kāi)啟的路徑2. ?開(kāi)啟檔案的模式 ? ? ?資源類型需要其他的函數(shù)來(lái)操作這個(gè)資源。所有的資源有開(kāi)啟就要有關(guān)閉。
fread#函數(shù) 函數(shù)的功能的功能是讀取開(kāi)啟的檔案資源。讀取指定長(zhǎng)度的檔案資源,讀取一部分向後移動(dòng)一部分。至到文件結(jié)尾。
fclose函數(shù) fclose函數(shù)的功能是關(guān)閉資源。資源有開(kāi)啟就有關(guān)閉。
?fopen的模式(下表): | ? ? ? ? |
#? | |
w#########只寫(xiě)。開(kāi)啟並清空文件的內(nèi)容;如果文件不存在,則建立新文件。 ###############? ??#### w+ | 讀/寫(xiě)。開(kāi)啟並清空文件的內(nèi)容;如果文件不存在,則建立新文件。 |
? ? ? a | 追加。開(kāi)啟並向文件末尾進(jìn)行寫(xiě)入操作,如果文件不存在,則建立新文件。 |
a+ | 讀取/追加。透過(guò)向文件末尾寫(xiě)內(nèi)容,來(lái)保持文件內(nèi)容。 |
? ? x | 只寫(xiě)。建立新文件。如果檔案已存在,則傳回 FALSE 和一個(gè)錯(cuò)誤。 |
?? x+ | 讀/寫(xiě)。建立新文件。如果檔案已存在,則傳回 FALSE 和一個(gè)錯(cuò)誤。 |
t | windows下將\n轉(zhuǎn)為\r\n |
#? ? ?b | 二進(jìn)位開(kāi)啟模式 |
1.開(kāi)啟檔案
#file.txt 檔案的內(nèi)容如下
#You're welcome
<?php //你可以創(chuàng)建一個(gè)file.txt,以只讀模式打開(kāi) $fp = fopen('file.txt', "r"); //var_dump()操作一下$fp看看效果,輸出的是不是只有類型提示的是resource var_dump($fp); ?>
2.讀取檔案
<?php $fp = fopen('file.txt', "r"); //打開(kāi)一個(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; ?>
程式執(zhí)行結(jié)果:
?You're welcome
#file_put_contents和fwrite寫(xiě)入檔案
??file_put_contents ( string $檔案路徑, string $寫(xiě)入資料])
?功能:寫(xiě)入指定的檔案中寫(xiě)入一個(gè)字串,如果文件不存在則建立文件。傳回的是寫(xiě)入的位元組長(zhǎng)度
#<?php
header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼
$data = "我是一個(gè)兵,來(lái)自老百姓";
$numbytes = file_put_contents('binggege.txt', $data);
if($numbytes){
echo '寫(xiě)入成功,我們讀取看看結(jié)果試試:';
echo file_get_contents('binggege.txt');
}else{
echo '寫(xiě)入失敗或者沒(méi)有權(quán)限,注意檢查';
}
?>
程式運(yùn)行結(jié)果:
?寫(xiě)入成功,我們讀取看看結(jié)果試試:我是一個(gè)兵,來(lái)自老百姓
fwrite
( resource $檔案資源變數(shù), string $寫(xiě)入的字串[, int 長(zhǎng)度]):fwrite的別名函數(shù)是fputs??
註
我們上面試了r模式,只道是讀取的時(shí)候使用,接下來(lái)我們用fwrite加上fopen中的w,寫(xiě)入模式來(lái)進(jìn)行檔案寫(xiě)入
實(shí)例
你可以試試看新個(gè)test.txt檔案向裡面寫(xiě)入內(nèi)容。然後,可以試試看把test.txt刪除??纯从惺颤N提示。 <?php
header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只來(lái)自南方的狼,一直在尋找心中的花姑娘');
fclose($fp);
print $len ."字節(jié)被寫(xiě)入了\n";
?>
模式 | 說(shuō)明 |
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'test.txt'; $fp= fopen($filename, "r"); $len = fwrite($fp, '我是一只來(lái)自南方的狼,一直在尋找心中的花姑娘'); fclose($fp); print $len .'字節(jié)被寫(xiě)入了\n'; ?>
#程式執(zhí)行結(jié)果:
?0位元組被寫(xiě)入了\n
我們發(fā)現(xiàn)只用r 的話寫(xiě)入是不成功的
建立臨時(shí)檔案
我們先前建立的檔案都是永久檔案。
而建立臨時(shí)檔案在我們平常的專案開(kāi)發(fā)中也非常有用。建立臨時(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的水裝起來(lái),然後把A的資料寫(xiě)入B裡面。把臨時(shí)瓶子的水追加到C裡面。
我們來(lái)學(xué)習(xí)這個(gè)函數(shù):
resource tmpfile ( )
功能:建立一個(gè)暫存文件,傳回資源類型。關(guān)閉檔案即被刪除。
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $handle = tmpfile(); //向里面寫(xiě)入了數(shù)據(jù) $numbytes = fwrite($handle, '寫(xiě)入臨時(shí)文件的內(nèi)容'); //關(guān)閉臨時(shí)文件,文件即被刪除 fclose($handle); echo '向臨時(shí)文件中寫(xiě)入了'.$numbytes . '個(gè)字節(jié)'; ?>
#程式執(zhí)行結(jié)果:
<?php $fileName1="text.txt"; $fileName2="text--1.txt"; rename($fileName1,$fileName2); ?>寫(xiě)入了27個(gè)位元組
移動(dòng),拷貝,刪除檔案
重新命名檔案
rename($舊名,$新名稱);
這個(gè)函數(shù)傳回一個(gè)bool值,將舊的名字改為新的名字。
實(shí)例
<?php $filename = 'file.txt'; //舊文件名 $filename2 = 'copy-file.txt'; //新文件名 copy($filename, $filename2); //修改名字。 ?>
上面的例子就是將一個(gè)text.txt的檔案改名為text--1.txt 的例子,你不妨可以試試
複製檔案
#?copy(來(lái)源文件,目標(biāo)文件)
功能:將指定路徑的來(lái)源文件,複製一份到目標(biāo)文件的位置。
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'test.txt'; unlink($filename); ?>
#上面的範(fàn)例是將一個(gè)檔案名稱為file.txt的文件,複製一份名為copy-file.txt 的文件,內(nèi)容相同。
刪除檔案
?unlink (指定路徑的檔案)
實(shí)例
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'file.txt'; echo $filename . '文件大小為: ' . filesize($filename) . ' bytes'; ?>
上面的範(fàn)例是將一個(gè)檔案名稱為test.txt的檔案刪除
檔案常用的函數(shù)
filesize 偵測(cè)檔案的大小
實(shí)例
<?php //以增加的r模式打開(kāi) $fp = fopen('text.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgetc($fp) ."<br>"; //我要全部讀取可以,讀取一次將結(jié)果賦值一次給$string while($string = fgetc($fp)){ echo $string; } ?>
程式執(zhí)行結(jié)果:
#file.txt檔案大小為: 14 bytes
#其他操作檔案的函數(shù),讀取檔案
函數(shù)名稱 | |
#功能 |
我們透過(guò)一個(gè)實(shí)例來(lái)把上面幾個(gè)函數(shù)都用到。
我們?cè)趖ext.txt檔案中寫(xiě)入一批檔案:
abcdeefghijklk
opqrst
# uvwxyz
12345678
fgetc每次讀取一個(gè)
<?php //以增加的r模式打開(kāi) $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é)果:
#?a
bcdeefghijklk opqrst uvwxyz 12345678
fgets每次開(kāi)啟一行:
<?php //打開(kāi)我們上面的text.txt文件 $file = fopen("text.txt", "a+"); //你可以數(shù)數(shù)20個(gè)字有多長(zhǎng),看看是不是達(dá)到效果了 echo ftruncate($file,10); fclose($file); ?>##fgets每次開(kāi)啟一行:
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 $filename = 'text.txt'; if (file_exists($filename)) { echo "$filename"."文件的上次訪問(wèn)時(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)); } ?>
#fgets每次開(kāi)啟一行:
<?php //設(shè)置打開(kāi)的目錄是D盤(pán) $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); } } ?>
#fgets每次開(kāi)啟一行:
<?php //設(shè)置打開(kāi)的目錄是D盤(pán) $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); } } ?>
#fgets每次開(kāi)啟一行:
<?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 />"; ?>#」執(zhí)行結(jié)果:
abcdeefghijklk
opqrst uvwxyz 12345678
檔截取函數(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)行程序,可以開(kāi)啟text.txt 文件,看看是不是有20的位元組######## #######檔案的時(shí)間函數(shù)########################################函數(shù)############? ?#######功能說(shuō)明##################? ? filectime#######??檔案建立時(shí)間# ###########? ??filemtime######? 檔案修改時(shí)間############? ??fileatime#######??檔案上造訪時(shí)間##### #######
實(shí)例
<?php $a=dirname(__FILE__); echo$a; ?>
程式運(yùn)行結(jié)果:
text.txt檔案的上次訪問(wèn)時(shí)間是: 2016-09-13 17:44:40
text.txt檔案的建立時(shí)間是: 2016-09-13 17:32:16
text.txt檔案的修改時(shí)間是: 2016-09 -13 17:44:55
目錄處理函數(shù)
之前我們處理的全都是文件,那目錄和資料夾怎麼處理呢?
我們就來(lái)學(xué)習(xí)目錄或稱為資料夾的處理相關(guān)函數(shù)。
處理資料夾的基本想法如下:
#1.??? 讀取某個(gè)路徑的時(shí)候判斷是否是資料夾
2.??? 是資料夾的話,開(kāi)啟指定資料夾,返回檔案目錄的資源變數(shù)
3.??? 使用readdir讀取一次目錄中的文件,目錄指標(biāo)向後偏移一次
4.??? 使用readdir讀取到最後,沒(méi)有可讀的檔案回傳false
5.??? 關(guān)閉檔案目錄
我們來(lái)學(xué)習(xí)一下比較常用函數(shù):
? ? ? 函數(shù)名稱 | ? ? ? ?功能 |
opendir | #開(kāi)啟資料夾,回傳操作資源 |
readdir | 讀取資料夾資源 |
is_dir | 判斷是否為資料夾 |
closedir | 關(guān)閉資料夾操作資源 |
filetype | 顯示是資料夾還是文件,檔案顯示file,資料夾顯示dir |
#實(shí)例
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
可以執(zhí)行程序,看看是不是你電腦D碟的目錄
#判斷檔案的類型
<?php //定義一個(gè)關(guān)聯(lián)數(shù)組 $data = [ 'username'=>'liwenkai', 'area'=>'hubei', 'pwd'=>'123' ]; //生成query內(nèi)容 echo http_build_query($data); ?>
運(yùn)行程式看看
檔案路徑函數(shù)
#我們常常會(huì)遇到處理檔案路徑的情況。
例如:
1.??? 檔案後綴需要取出來(lái)
2.??? 路徑需要取出名字不取目錄
3.??? 只需要取出路徑名中的目錄路徑
4.??? 或?qū)⒕W(wǎng)址中的各部份解析取得獨(dú)立值
5. ? ?甚至是自己組成一個(gè)url出來(lái)
很多地方都需要用路徑處理類別的函數(shù)。
我們把常用的路徑處理函數(shù)為大家做了標(biāo)註,大家對(duì)著這個(gè)路徑處理函數(shù)進(jìn)行處理即可:
?函數(shù)名稱 | ? ?? 功能 |
回傳文件的各個(gè)組成部分 | |
傳回檔案名稱 | |
#檔案目錄部 | |
?網(wǎng)址拆解成各部份 |
? ?http_build_query | ##? ?http_build_query |
? ?http_build_url |
pathinfo
?pathinfo ( string $路徑)
功能:傳入檔案路徑回傳檔案的各個(gè)組成部份
實(shí)例
rrreee程式運(yùn)行結(jié)果:
檔案目錄名稱:D:/www
檔案全名:a.html
檔案副檔名:html
不包含擴(kuò)充功能的檔案名稱:a
basename
basename ( string $路徑[, string $suffix ])
功能:傳入路徑回傳檔名
第一個(gè)參數(shù)傳入路徑。
第二個(gè)參數(shù),指定我檔案名稱到了指定字元停止。
實(shí)例
rrreee程式運(yùn)行結(jié)果:
?1: a.html
?2: include
?3: text.txt
dirname
dirname(string $路徑)?
功能:傳回檔案路徑的檔案目錄部份
實(shí)例##rrreee
執(zhí)行一下你的程式
parse_url
#?parse_url ( string $路徑)功能:將網(wǎng)址拆解成各部份
實(shí)例rrreee
程式運(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 $需要處理的資料) 功能:產(chǎn)生url 中的query字串
實(shí)例
rrreee#程式執(zhí)行結(jié)果:
username= liwenkai&area=hubei&pwd=123
PHP Filesystem 參考手冊(cè)
#如需查看PHP 檔案系統(tǒng)函數(shù)的完整參考手冊(cè),請(qǐng)?jiān)煸L我們的PHP Filesystem 參考手冊(cè)。
- 課程推薦
- 課件下載
-
初級(jí)PHP 零基礎(chǔ)入門(mén)教學(xué)
176389人在看 -
初級(jí)零基礎(chǔ)新手入門(mén)PHP教程
27832人在看 -
中級(jí)尚學(xué)堂android開(kāi)發(fā)零基礎(chǔ)入門(mén)影片教學(xué)
34426人在看 -
初級(jí)小甲魚(yú)零基礎(chǔ)入門(mén)學(xué)習(xí)Python影片教學(xué)
179357人在看 -
初級(jí)CSS 0基礎(chǔ)入門(mén)教學(xué)
24632人在看 -
中級(jí)極客學(xué)院jquery零基礎(chǔ)入門(mén)影片教程
9528人在看 -
初級(jí)EasyUI基礎(chǔ)入門(mén)影片教學(xué)
17621人在看 -
初級(jí)HTML5入門(mén)基礎(chǔ)影片教學(xué)
12694人在看 -
初級(jí)Css3入門(mén)基礎(chǔ)影片教學(xué)
10992人在看 -
初級(jí)JavaScript入門(mén)基礎(chǔ)影片教學(xué)
12323人在看 -
初級(jí)jQuery入門(mén)基礎(chǔ)影片教學(xué)
12024人在看 -
初級(jí)Nginx基礎(chǔ)入門(mén)影片教學(xué)
25066人在看
看過(guò)本課程的同學(xué)也在學(xué)習(xí)
- 簡(jiǎn)單聊聊PHP創(chuàng)業(yè)那點(diǎn)事
- Web前端開(kāi)發(fā)極速入門(mén)
- 大型實(shí)戰(zhàn)天龍八部之開(kāi)發(fā)Mini版MVC架構(gòu)仿糗事百科網(wǎng)站
- PHP實(shí)戰(zhàn)開(kāi)發(fā)極速入門(mén): PHP快速創(chuàng)建[小型商業(yè)論壇]
- 登入驗(yàn)證與經(jīng)典留言板
- 電腦網(wǎng)路知識(shí)集合
- 快速入門(mén)Node.JS全套完整版
- 最懂你的大前端課:HTML5/CSS3/ES6/NPM/Vue/...【原文】
- 自己動(dòng)手寫(xiě) PHP MVC 框架(40節(jié)精講/鉅細(xì)/新人進(jìn)階必看)