PHP開發(fā)基礎(chǔ)教程之PHP對文件的操作
一、文件系統(tǒng)
1.我們會點鼠標右鍵刪除文件、會control+c(或右鍵)復(fù)制、粘貼文件,會新建一些文件,檢測這個文件是不是只讀文件。
2.在電腦里面進行的這些操作,在代碼里面如果能操作就好了。
3.因為,如果有了這些操作。我們能做很多事情了:
?可不可以寫入修改配置文件?
是不是可以做PHP安裝的時候檢測文件的權(quán)限
是不是可以做生成Html文件等等很多不同的操作
..... 其他太多太多的地方用到了文件操作。
4.學(xué)習(xí)文件處理本質(zhì)上面就是學(xué)習(xí)文件處理的函數(shù)。再結(jié)合之前寫的代碼,完善自己的業(yè)務(wù)處理能力。
二、讀取文件
1.readfile讀取文件
那如何讀取一個文件呢?我們先學(xué)一個函數(shù)。
int readfile ( string $文件名)
功能:傳入一個文件路徑,輸出一個文件。
下面的這一段代碼中,只要傳入文件名或者指定的文件路徑就把文件讀取出來了。
<?php //linux類的讀了方式 readfile("/home/paul/test.txt"); //windows類的讀取方式 readfile("c:\boot.ini"); ?>
注意:上面的代碼中windows的斜線是斜線,可能會轉(zhuǎn)義掉一些字符。因此,我們寫的時候?qū)懮蟽蓚€斜線。
2.file_get_contents打開文件
上面的是單純打文件就直接輸出了,有沒有打開文件后,能夠賦值給一個變量的操作方式呢。
PHP當然會提供這種方式。這個方式就是PHP打開文件并返回內(nèi)容的方式之一,我們來看看函數(shù):
string file_get_contents ( string filename)
功能:傳入一個文件或文件路徑,打開這個文件返回文件的內(nèi)容。文件的內(nèi)容是一個字符串。
<?php $filename = 'NoAlike.txt'; $filestring = file_get_contents($filename); echo $filestring; ?>
上面的代碼,就打開了一個文件,并且將文件當中的內(nèi)容進行了輸出。
我們來針對之前的知識把代碼進行一下擴展。用一用之前的知識點。
<?php //假設(shè)我們有一個多行的文件叫NoAlike.txt,沒有的話你可以新建一個這個文件 $filename = 'NoAlike.txt'; //打開這個文件,將文件內(nèi)容賦值給$filestring $filestring = file_get_contents($filename); //因為每一行有一個回車即\n,我用\n來把這個字符串切割成數(shù)組 $filearray = explode("\n", $filestring); //把切割成的數(shù)組,下標賦值給$key,值賦值給$val,每次循環(huán)將$key加1。 while (list($key, $val) = each($filearray)) { ++$key; $val = trim($val); //用的單引號,單引號不解釋變量進行了拼接而已 print 'Line' . $key .':'. $val.'<br />'; } ?>
上面,我們就把之前所學(xué)的知識進行了組合。
3.fopen、fread、fclose操作讀取文件
上面file_get_contents打開文件的方式簡單、粗暴。下面的
?resource fopen ( string $文件名, string 模式)
string fread ( resource $操作資源, int 讀取長度)
?bool fclose ( resource $操作資源 )
通過上面的函數(shù)我們來講解資源類型的通常操作方式:
?打開資源
使用相關(guān)函數(shù)進行操作
?關(guān)閉資源
fopen函數(shù)?fopen函數(shù)的功能是打開文件,參數(shù)主要有兩個:
l?文件打開的路徑
l?打開文件的模式
返回類型是一個資源類型,我們第一次遇到了之前基礎(chǔ)類型的時候講到的資源類型。
資源類型需要其他的函數(shù)來操作這個資源。所有的資源有打開就要有關(guān)閉。
fread函數(shù)?函數(shù)的功能的功能是讀取打開的文件資源。讀取指定長度的文件資源,讀取一部份向后移動一部份。至到文件結(jié)尾。
fclose函數(shù)?fclose函數(shù)的功能是關(guān)閉資源。資源有打開就有關(guān)閉。
了解完函數(shù),后兩個函數(shù)比較簡單。而fopen函數(shù)的模式到底是什么,fopen的模式有下面幾個,我們來講一下fopen的模式:
接下來,我們只來學(xué)習(xí)r模式,下節(jié)課我們在將寫入的時候再來講講其他幾個模式。
三、我們先會讀取文件了,才能很好的掌握寫入文件。
1.打開文件
<?php //你可以創(chuàng)建一個NoAlike.txt,以只讀模式打開 $fp = fopen('NoAlike.txt', "r"); //var_dump()操作一下$fp看看效果,輸出的是不是只有類型提示的是resource var_dump($fp); ?>
2.讀取文件
<?php $fp = fopen('NoAlike.txt', "r"); //打開一個文件類型后,讀取長度 $contents = fread($fp, 1024); ?>
3.關(guān)閉文件
<?php $fp = fopen($filename, 'r'); $contents = fread($fp, 1024); fclose($fp); echo $contents; ?>
其他注意事項:
使用示例:
<?php $fp = fopen($filename, 'ab'); $contents = fwrite($fp, '可愛的很\n喲'); fclose($fp); echo $contents; ?>
說明:
實驗無法讓肉眼看到這個實驗效果。大家記住有這個特點即可。
Windows 下提供了一個文本轉(zhuǎn)換標記('t')可以透明地將 n 轉(zhuǎn)換為 rn。
與此對應(yīng)還可以使用 'b' 來強制使用二進制模式,這樣就不會轉(zhuǎn)換數(shù)據(jù)。要使用這些標記,要么用 'b' 或者用 't' 作為 mode 參數(shù)的最后一個字符。
四、創(chuàng)建和修改文件內(nèi)容
1.file_put_contents寫入文件
我們先來學(xué)習(xí)第一種寫入文件的方式:
int file_put_contents ( string $文件路徑, string $寫入數(shù)據(jù)])
功能:向指定的文件當中寫入一個字符串,如果文件不存在則創(chuàng)建文件。返回的是寫入的字節(jié)長度
<?php $data = "我是一個兵,來自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '寫入成功,我們讀取看看結(jié)果試試:'; echo file_get_contents('binggege.txt'); }else{ echo '寫入失敗或者沒有權(quán)限,注意檢查'; } ?>
我們發(fā)現(xiàn)寫入文件也挺簡單的。按照這個函數(shù)的格式,指定文件,寫入字符串數(shù)據(jù)就可以了。
2.fwrite配合fopen進行寫入操作
int fwrite ( resource $文件資源變量, string $寫入的字符串 [, int 長度])
注:fwrite的別名函數(shù)是fputs
我們上節(jié)課試了r模式,只道是讀取的時候使用,接下來我們用fwrite加上fopen中的w,寫入模式來進行文件寫入。
我們來看一下特點:
寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建。
注意:在下面的實驗中,你可以試試新建個test.txt文件向里面寫入內(nèi)容。然后,可以試試把test.txt刪除??纯从惺裁刺崾尽?/strong>
<?php $filename = 'test.txt'; $fp= fopen($filename, "w"); $len = fwrite($fp, '我是一只來自南方的狼,一直在尋找心中的花姑娘'); fclose($fp); print $len .'字節(jié)被寫入了\n"; ?>
總結(jié):
1.不論有沒有新建都會打開文件重新寫入
2.原有的文件內(nèi)容會被覆蓋掉
3.文件不存在會創(chuàng)建
那我們來對比一下以下幾個模式的不同:
我們來通過實驗證明一下:
<?php $filename = 'test.txt'; $fp= fopen($filename, "r+"); $len = fwrite($fp, '我是一只來自南方的狼,一直在尋找心中的花姑娘'); fclose($fp); print $len .'字節(jié)被寫入了\n'; ?>
實驗時可以把r后面的+號去掉。
我們通過實驗,確實發(fā)現(xiàn)使用r模式,在文件存的時候可以進行寫入數(shù)據(jù),只用r的話,寫入是不成功的。
3.a模式和w模式的不同
同樣是下面的這段代碼,我們改為a模式。
<?php $filename = 'test.txt'; $fp= fopen($filename, "a"); $len = fwrite($fp,'讀大學(xué)迷茫了,PHP學(xué)院PHP給你希望'); echo $len .'字節(jié)被寫入了\n'; ?>
打開網(wǎng)頁執(zhí)行這段代碼,你會發(fā)現(xiàn):每刷新一次,文件中就會多一段
讀大學(xué)迷茫了,PHP學(xué)院PHP給你希望。
總結(jié):
4.x模式和w模式的不同
這段代碼我們再實驗一次,改為x模式:
<?php $filename = 'test.txt'; $fp= fopen($filename, "x"); $len = fwrite($fp,'讀大學(xué)迷茫了,PHP學(xué)院PHP給你希望'); echo $len .'字節(jié)被寫入了\n'; ?>
我們會發(fā)現(xiàn):
文件存在的時候會報錯
如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的時候又報錯了
x+ 是增強的x模式。讀取時也可以使用。
五、創(chuàng)建臨時文件
我們之前創(chuàng)建的文件都是永久文件。
而創(chuàng)建臨時文件在我們平時的項目開發(fā)中也非常有用。創(chuàng)建臨時文件的幾個好處:
1.文完后即刪除
2.不需要去維護這個文件的刪除狀態(tài)
例如:我需要把A的文件內(nèi)容轉(zhuǎn)存B里面,把B的文件內(nèi)容轉(zhuǎn)存到C里面。
就跟現(xiàn)實生活中一樣,我可以先用一個臨時的瓶子把B的水裝起來,然后把A的數(shù)據(jù)寫入到B里面。把臨時瓶子的水追加到C里面。
我們來學(xué)習(xí)一下這個函數(shù):
resource tmpfile ( )
功能:創(chuàng)建一個臨時文件,返回資源類型。關(guān)閉文件即被刪除。
<?php //創(chuàng)建了一個臨時文件 $handle = tmpfile(); //向里面寫入了數(shù)據(jù) $numbytes = fwrite($handle, '寫入臨時文件'); //關(guān)閉臨時文件,文件即被刪除 fclose($handle); echo '向臨時文件中寫入了'.$numbytes . '個字節(jié)'; ?>
六、移動、拷貝和刪除文件
1.重命名
bool rename($舊名,$新名);
這個函數(shù)返回一個bool值,將舊的名字改為新的名字。
<?php //舊文件名 $filename = 'test.txt'; //新文件名 $filename2 = $filename . '.old'; //復(fù)制文件 rename($filename, $filename2); ?>
我們打開目錄,我們可以看看效果,你會發(fā)現(xiàn)把指定的文件,復(fù)制了一份到了目標路徑。
2.復(fù)制文件
復(fù)制文件,就相當于是克隆技術(shù),將一個原來的東西再克隆成一個新的東西。兩個長得一模一樣。
bool copy(源文件,目標文件)
功能:將指定路徑的源文件,復(fù)制一份到目標文件的位置。
我們來通過實驗和代碼來玩玩:
<?php //舊文件名 $filename = 'copy.txt'; //新文件名 $filename2 = $filename . '_new'; //修改名字。 copy($filename, $filename2); ?>
總結(jié):
你會通過上面的例子,發(fā)現(xiàn)多出來了一個文件。
3.刪除文件
刪除文件就是將指定路徑的一個文件刪除,不過這個刪除是直接刪除。使用的是windows電腦,你在回收站看不到這個文件。
你只會發(fā)現(xiàn),這個文件消失了。
bool unlink(指定路徑的文件)
<?php $filename = 'test.txt'; if (unlink($filename)) { echo "刪除文件成功 $filename!\n"; } else { echo "刪除 $filename 失敗!\n"; } ?>
七、檢測文件屬性函數(shù)
有些同學(xué)特別好奇,檢測文件屬性用在什么地方。檢測文件屬性能用到的地方太多了。
我們來舉例子:
1.我們在做軟件安裝的時候,大家會發(fā)現(xiàn)如果文件存在了,就跳轉(zhuǎn)到了其他的地方。
2.如果在安裝的過程當中,某些文件沒有寫入權(quán)限,就不讓進行安裝。
我們來舉一個國內(nèi)非常出名的軟件,discuz的安裝過程截圖給大家看看:
?
上面的例子,就是典型的文件檢測的用法。
我們來學(xué)習(xí)一下下面的一批函數(shù)。然后,我們來通過一個例子進行學(xué)習(xí)。
bool file_exists ( $指定文件名或者文件路徑)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路徑)
功能:文件是否可讀
bool is_writeable ( $指定文件名或者文件路徑)
功能:文件是否可寫
bool is_executable ( $指定文件名或者文件路徑)
功能:文件是否可執(zhí)行
bool is_file ( $指定文件名或者文件路徑)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路徑)
功能:是否是目錄
void clearstatcache ( void )
功能:清楚文件的狀態(tài)緩存
上面的功能一看就清楚了。那實驗,我們就來寫這個最開始我們舉的這個例子。
我們來講第一個例子,文件鎖。如果已經(jīng)安裝了,存在安裝鎖就提示已安裝,否則就繼續(xù)安裝。
我們假設(shè)安裝界面的網(wǎng)址是:install.php,安裝的鎖文件是install.lock。我們就可以檢測install.lock文件是否存在。
<?php if(file_exists('install.lock')){ echo '已安裝,請不要再次進行安裝'; exit; } ?>
我們接下來做一個文件安裝檢測的實驗來檢測文件或目錄是否有寫入或者讀取權(quán)限。如果沒有則不能進行安裝。
處理這件事情的思路如下:
1.定義一批需要檢測權(quán)限的數(shù)組
2.可以檢測是文件夾還是文件
3.做一個標置位變量,如果標置位變量一旦為false則不顯示下一步的安裝
<?php //可以定義一批文件是否存在 $files = [ 'config.php', 'img/', 'uploads/', ]; //定義標志位變量 $flag = true; foreach($files as $v){ echo $v; //判斷是文件還是文件夾 if(is_file($v)){ echo '是一個文件 '; }else if(is_dir($v)){ echo '是一個文件夾 '; } if(is_readable($v)){ echo ' 可讀'; }else{ echo '<font color="red">不可讀</font>'; } if(is_writeable($v)){ echo '可寫'; }else{ echo '<font color="red">不可寫</font>'; } echo '<br />'; } if($flag){ echo '<a href="step1">下一步</a>'; }else{ echo '不能進行安裝'; } ?>
通過上面的例子,我們就做到了。實現(xiàn)PHP某個軟件安裝過程當中的安裝檢測。
也就是我們上面思路的實現(xiàn)。
八、文件常用函數(shù)和常量
1.文件操作的常量
下面這一個常量是最常用的。是文件目錄的分割符的常量。
我們來看看格式:
windows 的路徑格式為 d:xxxxxx 注意:windows支持 d:/xxx/xxx
linux 的路徑格式為 /home/xxx/xxx 注意:如果homexxxxxx 在linux上是錯誤的
所以當你開啟轉(zhuǎn)義之類的話,轉(zhuǎn)義字符 用一起的話 d:xxxxxx 是一樣的。判斷時候有兩個 有的話 再轉(zhuǎn)成一個 再把 替換成 /當路徑分割,這樣在linux上或者windos上的路徑就能保持統(tǒng)一了。
我們會使用到一個常量:
DIRECTORY_SEPARATOR
我們來寫一個小的實例,定義當前文件所在的路徑:
由于FILE是PHP的預(yù)定義常量,所以沒辦法改變,如果需要讓FILE也自適應(yīng)操作系統(tǒng)。
那么就是不要用FILE,可以用自定義的常量,并且把FILE處理一下,如下:
<?php $_current_file = str_replace(array('/', '\'), DIRECTORY_SEPARATOR, __FILE__); define('__CUR_FILE__', $_current_file); echo __CUR_FILE__; ?>
2.文件指針操作函數(shù)
rewind ( resource handle)
功能:指針回到開始處
fseek ( resource handle, int offset [, int from_where])
功能:文件指針向后移動指定字符
我們在之前的讀取當中我們發(fā)現(xiàn)fread讀取指定長度的數(shù)據(jù)。讀取指定長度的內(nèi)容,下次再讀取的時候從原位置開始再接著向后讀取。
?
如上圖,我們可以想象:
1.文件剛打開的時候讀取到的是紅色的圖標
2.文件假色從A讀取到了C
3.我們在demo.txt文件中寫入一批文件:
Abcdeefghijklk
?Opqrst
Uvwxyz
?12345678
我們可開始來實驗一次。
<?php $fp = fopen('output.txt', 'r+'); //讀取10個字符 echo fread($fp,10); //指針設(shè)置回到開始處 rewind($handle); //再讀取10次看看輸出的是什么 echo fread($fp,10); //文件指針向后移動10個字符 echo fseek($fp,10); //再看看文件中輸出的是什么 echo fread($fp,10); fclose($handle); ?>
上面的例子,你會發(fā)現(xiàn)fseek指定多長就移動多少個字節(jié)。而rewind每次都是回到文件的開始處。
那如何移動到最末尾呢?我們可以統(tǒng)計字節(jié)數(shù)。在fseek的時候直接移到回后。
下面我們來講filesize統(tǒng)計字節(jié)數(shù)。
3.filesize 檢測文件的大小
<?php $filename = 'demo.txt'; echo $filename . '文件大小為: ' . filesize($filename) . ' bytes'; ?>
4.其它操作文件的函數(shù)
其實還有一些其他操作文件的函數(shù),讀取文件
我們通過一個實例來把上面幾個函數(shù)都用到。
我們在demo.txt文件中寫入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
<?php //以增加的r模式打開 $fp = fopen('demo.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個字符 echo fgetc($fp); //我要全部讀取可以,讀取一次將結(jié)果賦值一次給$string while($string = fgetc($fp)){ echo $string; } ?>
fgets每次打開一行:
<?php //以增加的r模式打開 $fp = fopen('demo.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個字符 echo fgets($fp); echo fgets($fp); echo fgets($fp); echo fgets($fp); ?>
上面的代碼,你會發(fā)現(xiàn)每次讀取一次打開一行。讀取最后返回的是false。
我們接下來看文件截取函數(shù):
<?php //打開我們上面的demo.txt文件 $file = fopen("demo.txt", "a+"); //你可以數(shù)數(shù)20個字有多長,看看是不是達到效果了 echo ftruncate($file,20); fclose($file); ?>
上例中我們發(fā)現(xiàn),截取多長就能顯示多長的內(nèi)容。
5.文件的時間函數(shù)
<?php $filename = 'demo.txt'; if (file_exists($filename)) { echo "$filename文件的上次訪問時間是: " . date("Y-m-d H:i:s", fileatime($filename)); echo "$filename文件的創(chuàng)建時間是: " . date("Y-m-d H:i:s", filectime($filename)); echo "$filename文件的修改時間是: " . date("Y-m-d H:i:s", filemtime($filename)); } ?>
九、文件鎖機制
文件鎖機制一般在單一打開文件的時候根本看不到效果。這一塊的學(xué)習(xí)有一點點抽象。
大家不要去思考怎么實現(xiàn)的呀?
為什么看不到效果呀?
答:因為電腦的操作太快了,基本上是毫秒級的。所以這個實驗其實是看不到效果的。
這一章了解文件鎖的基本概念即可,熟悉文件鎖函數(shù)和鎖機制。
文件鎖的用途:
若一個人在寫入一個文件,另外一個人同時也打個了這個文件進行寫入文件。
這情況下,如果遇到一定的碰撞概率的話,不知道到底誰的操作為準。
因此,這個時候我們引入鎖機制。
若用戶A在寫入或者讀取這個文件的時候,將文件加上共享所。我可以讀,其他人也可以讀。
但是,我如果這與的時候。我使用獨占鎖。這個文件歸我了,你們都別動,除非我將文件鎖進行釋放。
注意:不論加上了文件鎖后要注意釋放。
我們來看看這個函數(shù):
bool flock ( resource $handle , int $operation)
功能:輕便的咨詢文件鎖定
我們來看看鎖類型:
我們接下來把demo.txt加上一個獨占鎖,進行寫入操作。
<?php $fp = fopen("demo.txt", "r+"); // 進行排它型鎖定 if (flock($fp, LOCK_EX)) { fwrite($fp, "文件這個時候被我獨占了喲\n"); // 釋放鎖定 flock($fp, LOCK_UN); } else { echo "鎖失敗,可能有人在操作,這個時候不能將文件上鎖"; } fclose($fp); ?>
說明:
上例中我為了寫入文件,把文件加上了獨占鎖。
如果我操作完成,寫入完成后,解除掉了獨占鎖。
如果是在讀取文件的時候,大家可加按照同樣的處理思路加上共享鎖。
十、目錄處理函數(shù)
之前我們處理的全都是文件,那目錄和文件夾怎么處理呢?
我們就來學(xué)習(xí)目錄或者稱為文件夾的處理相關(guān)函數(shù)。
處理文件夾的基本思想如下:
讀取某個路徑的時候判斷是否是文件夾
是文件夾的話,打開指定文件夾,返回文件目錄的資源變量
使用readdir讀取一次目錄中的文件,目錄指針向后偏移一次
使用readdir讀取到最后,沒有可讀的文件返回false
關(guān)閉文件目錄
我們來學(xué)習(xí)一比常用函數(shù):
<?php //設(shè)置打開的目錄是D盤 $dir = "d:/"; //判斷是否是文件夾,是文件夾 if (is_dir($dir)) { if ($dh = opendir($dir)) { //讀取一次向后移動一次文件夾指針 echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; //讀取到最后返回false //關(guān)閉文件夾資源 closedir($dh); } } ?>
即然是讀取一次向后移動一次,我們是不是可以
<?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); } } ?>
?
十一、文件權(quán)限設(shè)置
文件權(quán)限設(shè)置的函數(shù)在系統(tǒng)管理級別的軟件中很常用。例如:某個文件不準許guest組(來賓用戶)查看呀。
在企業(yè)管理中,某些用戶或者某些用戶文件只準讀取不準修改。這都是非常常用的功能。
注:
本章為了解章節(jié)。如果沒有學(xué)習(xí)過linux會有些吃力,可以跳過本章,了解有這個東西即可。
在實際生產(chǎn)環(huán)節(jié)中用處較少。
主要針對在linux下有過全面知識體系的同學(xué)可以重點學(xué)習(xí)。
windows下面有些功能無法實現(xiàn)。
上面的函數(shù)用法與linux的權(quán)限操作的用法一樣。
對于學(xué)過linux的同學(xué)來說學(xué)起來比較簡單。沒有學(xué)過的會有些吃力。
我只講一個例子,看看如何來修改權(quán)限:
chmod 主要是修改文件的的權(quán)限
<?php //修改linux 系統(tǒng)/var/wwwroot/某文件權(quán)限為755 chmod("/var/wwwroot/index.html", 755); chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); chmod("/somedir/somefile", 0755); ?>
十二、文件路徑函數(shù)
1.情景重現(xiàn)
我們經(jīng)常會遇到處理文件路徑的情況。
例如:
文件后綴需要取出來
路徑需要取出名字不取目錄
只需要取出路徑名中的目錄路徑
或者把網(wǎng)址中的各個部份進行解析取得獨立值
甚至是自己組成一個url出來
... ....
很多地方都需要用路徑處理類的函數(shù)。
我們把常用的路徑處理函數(shù)為大家做了標注,大家對著這個路徑處理函數(shù)進行處理即可:
2.Pathinfo
array pathinfo ( string $路徑)
功能:傳入文件路徑返回文件的各個組成部份
我們用具體的示例來用一下:
<?php $path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目錄名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件擴展名:'.$path_parts['extension']."<br />"; echo '不包含擴展的文件名:'.$path_parts['filename']."<br />"; ?>
結(jié)果如下:
文件目錄名:d:/www
文件全名:lib.inc.php
文件擴展名:php
不包含擴展的文件名:lib.inc
3.Basename
string basename ( string $路徑[, string $suffix ])
功能:傳入路徑返回文件名
第一個參數(shù)傳入路徑。
第二個參數(shù),指定我文件名到了指定字符停止。
<?php echo "1: ".basename("d:/www/index.d", ".d").PHP_EOL; echo "2: ".basename("d:/www/index.php").PHP_EOL; echo "3: ".basename("d:/www/passwd").PHP_EOL; ?> 4.Dirname dirname(string $路徑) 功能:返回文件路徑的文件目錄部份 <?php dirname(__FILE__); ?>
結(jié)論:你可以執(zhí)行看看是不是返回了文件的目錄部份。
5.parse_url
mixed parse_url ( string $路徑 )
功能:將網(wǎng)址拆解成各個部份
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
結(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"
}
6.http_build_query
string http_build_query ( mixed $需要處理的數(shù)據(jù))
功能:生成url 中的query字符串
<?php //定義一個關(guān)聯(lián)數(shù)組 $data = [ 'username'=>'liwenkai', 'area'=>'hubei' ]; //生成query內(nèi)容 echo http_build_query($data); ?>
結(jié)果如下:
username=liwenkai&area=hubei
http_build_url()?
功能: 生成一個url
?
注:
PHP_EOL 常量
在 windows平臺相當于 echo "rn";
在unixlinux平臺相當于 echo "n";
在mac平臺相當于 echo "r";
十三、文本留言本
我們講完了這么多關(guān)于文件處理的系統(tǒng),可是我們連一個最基本的小東西都寫不出來。
從這一節(jié)開始,大家會發(fā)現(xiàn)大家能夠?qū)懺絹碓蕉嗟臇|西了。
接下來我們我們來看看演示效果:
在下面一個界面中寫入留言內(nèi)容的表單界面:
存在留言后的展示界面:
我們來看一下文件結(jié)構(gòu):
index.php ---展示輸入框和留言內(nèi)容
write.php ---向message.txt寫入數(shù)據(jù)
message.txt ---存入聊天內(nèi)容
index.php文件
<?Php //設(shè)置時區(qū) date_default_timezone_set('PRC'); //讀了內(nèi)容 @$string = file_get_contents('message.txt'); //如果$string 不為空的時候執(zhí)行,也就是message.txt中有留言數(shù)據(jù) if (!empty($string)) { //每一段留言有一個分格符,但是最后多出了一個&^。因此,我們要將&^刪掉 $string = rtrim($string, '&^'); //以&^切成數(shù)組 $arr = explode('&^', $string); //將留言內(nèi)容讀取 foreach ($arr as $value) { //將用戶名和內(nèi)容分開 list($username, $content, $time) = explode('$#', $value); echo '用戶名為<font color="gree">' . $username . '</font>內(nèi)容為<font color="red">' . $content . '</font>時間為' . date('Y-m-d H:i:s', $time); echo '<hr />'; } } ?> <h1>基于文件的留言本演示</h1> <form action="write.php" method="post"> 用戶名:<input type="text" name="username" /><br /> 留言內(nèi)容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
看了剛剛的展示內(nèi)容,我們知道文件存儲時:
段與段之間進行了分割
內(nèi)容與用戶之前用一個特殊的符號進行了分割
下面我們來寫write.php寫入留言至文件的代碼:
<?php //追加方式打開文件 $fp=fopen('message.txt','a'); //設(shè)置時間 $time=time(); //得到用戶名 $username=trim($_POST['username']); //得到內(nèi)容 $content=trim($_POST['content']); //組合寫入的字符串:內(nèi)容和用戶之間分開,使用$# //行與行之間分開,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //寫入文件 fwrite($fp,$string); //關(guān)閉文件 fclose($fp); header('location:index.php'); ?>