php 文件常用函數(shù)和常量
文件操作的常量
下面這一個(gè)常量是最常用的。是文件目錄的分割符的常量。
我們來看看格式:
平臺 | 分割符 |
---|---|
windows | |
類unix | / |
windows 的路徑格式為 d:xxxxxx 注意:windows支持 d:/xxx/xxx
linux 的路徑格式為 /home/xxx/xxx 注意:如果homexxxxxx 在linux上是錯(cuò)誤的
所以當(dāng)你開啟轉(zhuǎn)義之類的話,轉(zhuǎn)義字符 用一起的話 d:xxxxxx 是一樣的。判斷時(shí)候有兩個(gè) 有的話 再轉(zhuǎn)成一個(gè) 再把 替換成 /當(dāng)路徑分割,這樣在linux上或者windos上的路徑就能保持統(tǒng)一了。
我們會(huì)使用到一個(gè)常量:
DIRECTORY_SEPARATOR
我們來寫一個(gè)小的實(shí)例,定義當(dāng)前文件所在的路徑:
由于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__; ?>
文件指針操作函數(shù)
rewind ( resource handle)
功能:指針回到開始處
fseek ( resource handle, int offset [, int from_where])
功能:文件指針向后移動(dòng)指定字符
我們在之前的讀取當(dāng)中我們發(fā)現(xiàn)fread讀取指定長度的數(shù)據(jù)。讀取指定長度的內(nèi)容,下次再讀取的時(shí)候從原位置開始再接著向后讀取。
如上圖,我們可以想象:
????1.文件剛打開的時(shí)候讀取到的是紅色的圖標(biāo)
????2.文件假色從A讀取到了C
????3.下次打開的時(shí)候可再從C綠色箭頭處開始讀取。
我們在demo.txt文件中寫入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
我們可開始來實(shí)驗(yàn)一次。
<?php $fp = fopen('demo2.txt', 'r+'); //讀取10個(gè)字符 echo fread($fp,10); //指針設(shè)置回到開始處 rewind($fp); //再讀取10次看看輸出的是什么 echo '<br>'; echo fread($fp,10); echo '<br>'; //文件指針向后移動(dòng)10個(gè)字符 echo fseek($fp,10); echo '<br>'; //再看看文件中輸出的是什么 echo fread($fp,10); echo '<br>'; fclose($fp); ?>
上面的例子,你會(huì)發(fā)現(xiàn)fseek指定多長就移動(dòng)多少個(gè)字節(jié)。而rewind每次都是回到文件的開始處。
那如何移動(dòng)到最末尾呢?我們可以統(tǒng)計(jì)字節(jié)數(shù)。在fseek的時(shí)候直接移到回后。
下面我們來講filesize統(tǒng)計(jì)字節(jié)數(shù)。
filesize 檢測文件的大小
<?php $filename = 'demo.txt'; echo $filename . '文件大小為: ' . filesize($filename) . ' bytes'; ?>
其它操作文件的函數(shù)
其實(shí)還有一些其他操作文件的函數(shù),讀取文件
函數(shù)名 | 功能 |
---|---|
file | 把整個(gè)文件讀入一個(gè)數(shù)組中 |
fgets | 從文件指針中讀取一行,讀到最后返回false |
fgetc | 從文件指針中讀取一個(gè)字符,讀到最后返回false |
ftruncate | 將文件截?cái)嗟浇o定的長度 |
我們通過一個(gè)實(shí)例來把上面幾個(gè)函數(shù)都用到。
我們在demo.txt文件中寫入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
<?php //以增加的r模式打開 $fp = fopen('demo.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgetc($fp); //我要全部讀取可以,讀取一次將結(jié)果賦值一次給$string while($string = fgetc($fp)){ echo $string; } ?>
fgets每次打開一行:
<?php //以增加的r模式打開 $fp = fopen('demo.txt','r+'); //你分發(fā)現(xiàn)每次只讀一個(gè)字符 echo fgets($fp); echo fgets($fp); echo fgets($fp); echo fgets($fp); ?>
上面的代碼,你會(huì)發(fā)現(xiàn)每次讀取一次打開一行。讀取最后返回的是false。
我們接下來看文件截取函數(shù):
<?php //打開我們上面的demo.txt文件 $file = fopen("demo.txt", "a+"); //你可以數(shù)數(shù)20個(gè)字有多長,看看是不是達(dá)到效果了 echo ftruncate($file,20); fclose($file); ?>
上例中我們發(fā)現(xiàn),截取多長就能顯示多長的內(nèi)容。
文件的時(shí)間函數(shù)
函數(shù) | 功能說明 |
---|---|
filectime | 文件創(chuàng)建時(shí)間 |
filemtime | 文件修改時(shí)間 |
fileatime | 文件上次訪問時(shí)間 |
<?php $filename = 'demo.txt'; if (file_exists($filename)) { echo '$filename文件的上次訪問時(shí)間是:' . date("Y-m-d H:i:s", fileatime($filename)); echo '$filename文件的創(chuàng)建時(shí)間是: ' . date("Y-m-d H:i:s", filectime($filename)); echo '$filename文件的修改時(shí)間是: ' . date("Y-m-d H:i:s", filemtime($filename));} ?>