1. 程式人生 > >PHP高階特性之檔案處理

PHP高階特性之檔案處理

檔案系統函式用法詳述

1.基本的判斷函式

is_dir — 判斷給定檔名是否是一個目錄

is_file — 判斷給定檔名是否為一個檔案

is_executable — 判斷給定檔名是否可執行

is_link — 判斷給定檔名是否為一個符號連線

is_readable — 判斷給定檔名是否可讀

is_uploaded_file — 判斷檔案是否是通過 HTTP POST 上傳的

is_writable — 判斷給定的檔名是否可寫

is_writeable — is_writable 的別名

2.檔案相關資訊獲取

file_exists — 檢查檔案或目錄是否存在

fileatime — 取得檔案的上次訪問時間

filectime — 取得檔案的 inode 修改時間

filegroup — 取得檔案的組

fileinode — 取得檔案的 inode

filemtime — 取得檔案修改時間

fileowner — 取得檔案的所有者

fileperms — 取得檔案的許可權

filesize — 取得檔案大小

filetype

 — 取得檔案型別

下面我們寫一個例子,傳入檔名,列印它的詳細資訊。

 

 function getFileInfo($filename){
        if(!file_exists($filename)){
            echo '檔案'.($filename).'不存在';
            return;
        }
        if(is_file($filename)){
            echo $filename.'是一個檔案';
        }
        if(is_dir($filename)){
            echo $filename.'是一個目錄';
        }
        if(is_executable($filename)){
            echo $filename.'是可執行檔案';
        }else{
            echo $filename.'不是可執行檔案';
        }

        if(is_readable($filename)){
            echo $filename.'是可讀的';
        }else{
            echo $filename.'不是可讀的';
        }
        if(is_writable($filename)){
            echo $filename.'是可寫入的';
        }else{
            echo $filename.'不是可寫入的';
        }
        echo '檔案'.$filename.'的大小是'.getFileSize(filesize($filename)).'';

        echo '檔案'.$filename.'的型別是'.filetype($filename).'';

        echo '檔案'.$filename.'的所有者是'.fileowner($filename).'';

        echo '檔案'.$filename.'的最後訪問時間為'.getTime(fileatime($filename)).'';

        echo '檔案'.$filename.'的inode是'.fileinode($filename).'';

        echo '檔案'.$filename.'的修改時間是'.getTime(filemtime($filename)).'';

        echo '檔案'.$filename.'的許可權是'.fileperms($filename).'';
    }
    function getTime($time){
        return date('Y-m-d H:i:s',$time);
    }
    function getFileSize($size){
        $dw = 'B';
        if($size>=pow(2,40)){
            $size=round($size/pow(2,40),2);
            $dw = 'PB';
        }else if($size>=pow(2,30)){
            $size=round($size/pow(2,30),2);
            $dw = 'TB';
        }else if($size>=pow(2,20)){
            $size=round($size/pow(2,20),2);
            $dw = 'GB';
        }else if($size>=pow(2,10)){
            $size=round($size/pow(2,10),2);
            $dw = 'MB';
        }
        return $size.$dw;
    }
    getFileInfo('1.php');

執行結果

1.php是一個檔案
1.php不是可執行檔案
1.php是可讀的
1.php不是可寫入的
檔案1.php的大小是2MB
檔案1.php的型別是file
檔案1.php的所有者是1000
檔案1.php的最後訪問時間為2015-03-04 12:58:33
檔案1.php的inode是536185
檔案1.php的修改時間是2015-03-04 12:58:32
檔案1.php的許可權是33204

 3.檔案路徑相關函式

相對路徑:相對於當前目錄的上級和下級目錄

. 當前目錄
.. 上一級目錄

路徑分隔符號

linux/Unix “/”
windows “\”
不管是什麼作業系統PHP的目錄分割符號都支技 / (Linux)

絕對路徑:可以指的作業系統的根,也可以指的是存放網站的文件根目錄

如果是在伺服器中執行(通過PHP檔案處理函式執行)路徑 則 “根”指的就是作業系統的根
如果程式是下載的客戶端,再訪問伺服器中的檔案時,只有通過Apache訪問,“根”也就指的是文件根目錄

三個相關函式

basename — 返回路徑中的檔名部分

dirname — 返回路徑中的目錄部分

pathinfo — 返回檔案路徑的資訊

例如下面的例子

 

1

2

3

4

5

6

7

8

    $url1="./aaa/bbb/index.php";

    $url2="../www/yyy/login.rar";

    $url3="c:/appserv/www/demo.html";

    $url4="http://localhost/yyy/www.gif";

    echo basename($url1);

    echo basename($url2);

    echo basename($url3);

    echo basename($url4);

執行結果

index.php
login.rar
demo.html
www.gif

可以看出,basename這個函式返回的是檔案的名,也就是最後一個專案。
下面我們看一下dirname的用法

 

1

2

3

4

5

6

7

8

    $url1="./aaa/bbb/index.php";

    $url2="../www/yyy/login.rar";

    $url3="c:/appserv/www/demo.html";

    $url4="http://localhost/yyy/www.gif";

    echo dirname(dirname($url1));

    echo dirname($url2);

    echo dirname($url3);

    echo dirname($url4);

執行結果

./aaa
../www/yyy
c:/appserv/www
http://localhost/yyy

可以發現,dirname這個函式可以多層巢狀使用,返回的就是它所在的路徑,即除了最後一項之外所有的項。

另外 pathinfo的以上所有資訊都可以獲取到,另外還包括了檔名和副檔名

比如下面的結果

Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )

4. 檔案的建立刪除修改

touch — 建立一個檔案

unlink — 刪除檔案

rename — 重新命名一個檔案或目錄

copy — 拷貝檔案

例如下面的例子

 

1

2

3

4

5

touch("./php.apahce"); //建立檔案

unlink("C:/AppServ/www/xsphp/apache.php");  //刪除檔案

rename("./test.txt", "d:/test2.txt");    //重新命名檔案

copy("cache.txt", "./cache5.txt");   //複製檔案

chmod("a.txt",755);   //設定檔案許可權

許可權相關內容

rwx 表這個檔案的擁有者 r讀 w寫 x執行
rwx 表這個檔案的擁有者所在的組 r讀 w寫 x執行
rwx 其它使用者對這個為檔案的許可權 r讀 w寫 x執行

檔案讀寫

1. file_get_contents(string)

傳入檔名,直接得到檔案中的文字資訊,返回的內容即為檔案中的文字。

例如

 

1

2

3

4

<?php

$str = file_get_contents("1.txt");

echo $str;

?>

則直接打開了 1.txt 檔案中的內容,並返回檔案中的文字資訊。

如果檔案不存在,那麼會提示

Warning: file_get_contents(2.txt): failed to open stream: No such file or directory

同樣,檔案還可以是遠端檔案,例如,引數傳入 http://www.qq.com

即可以呈現騰訊網的首頁內容。

缺點:不能讀取指定部分的內容,一次性全部讀取。

2. file_put_contents(filename,content)

寫入檔案,filename是寫入檔案的檔名,content是寫入內容,返回值是成功寫入的字元長度。

 

1

2

3

<?php

echo file_put_contents("2.txt",'abcd');

?>

2.txt 檔案如果不存在,那麼則會建立這個檔案並寫入 abcd 這個字串,返回 4 ,為字串的長度。 如果檔案存在,則會將檔案清空,然後寫入字串,返回寫入長度。

缺點:不能以追加的方式寫入檔案。

3.file(filename)

file是直接開啟某一個檔案,返回的結果是一個數組,每一行是陣列的一個元素。也就是說,獲取行數只需要輸出陣列的大小即可。例如

 

1

2

3

4

5

<?php

$str = file("1.txt");

var_dump($str);

echo count($str);

?>

即可得到陣列形式的行內容,而且輸出了行數。

缺點:不能讀取指定部分的內容。

4.fopen(filename,mode)

filename是檔名,可以是路徑加名,也可以是遠端伺服器檔案。

mode是開啟檔案的方式

r,以只讀模式開啟檔案
r+,除了讀,還可以寫入。
w, 以只寫的方式開啟,如果檔案不存在,則建立這個檔案,並寫放內容,如果檔案存在,並原來有內容,則會清除原檔案中所有內容,再寫入(開啟已有的重要檔案)
w+,除了可以寫用fwrite, 還可以讀fread
a,以只寫的方式開啟,如果檔案不存在,則建立這個檔案,並寫放內容,如果檔案存在,並原來有內容,則不清除原有檔案內容,再原有檔案內容的最後寫入新內容,(追加)
a+,除了可以寫用fwrite, 還可以讀fread
b,以二進位制模式開啟檔案(圖,電影)
t,以文字模式開啟檔案

注意:

r+具有讀寫屬性,從檔案頭開始寫,保留原檔案中沒有被覆蓋的內容;

w+具有讀寫屬性,寫的時候如果檔案存在,會被清空,從頭開始寫。

返回的是一個檔案資源

5.fwrite(file,content)

檔案寫入功能,file是檔案資源,用fopen函式獲取來的,content是寫入內容。同 fputs 函式。

例如

 

1

2

3

4

5

6

7

8

9

<?php

$file = fopen("1.txt","r+");

$result = fwrite($file,"xx");

if($result){

echo "Success";

}else

echo "Failed";

}

?>

則從頭開始寫入資源,即把前兩個字元設為 xx

6. fread(file,size)

讀取檔案指定部分的長度,file是檔案資源,由fopen返回的物件,size是讀取字元的長度。

例如

 

1

2

3

4

5

<?php

$file = fopen("1.txt","r");

$content = fread($file,filesize("1.txt"));

echo $content;

?>

不過,上述的 filesize 方法只能獲取本地檔案大小,對於遠端檔案的讀取就要換一種方法了。

例如

 

1

2

3

4

5

6

7

8

<?php

$file = fopen("http://www.qq.com","r");

$str = "";

while(!feof($file)){  //判斷時候到了檔案結尾

$str.=fread($file,1024);

}

echo $str;

?>

 

7.fgets(file)

file是檔案資源,每次讀取一行。例如我們讀取出騰訊首頁一共有多少行。

 

1

2

3

4

5

6

7

8

9

10

 <?php

$file = fopen("http://www.qq.com","r");

$str = "";

$count = 0;

while(!feof($file)){

$str .= fgets($file);

$count ++;

}

echo $count;

?>

會輸出結果 8893,我們可以檢視原始檔,看看它一共有多少行,驗證一下即可。

7.fgetc(file)

與fgets方法很相似,file是檔案資源,每次讀取個字元。例如我們讀取出騰訊首頁一共有多少個字元。

 

1

2

3

4

5

6

7

8

9

10

<?php

$file = fopen("http://www.qq.com","r");

$str = "";

$count = 0;

while(!feof($file)){

$str .= fgetc($file);

$count ++;

}

echo $count;

?>

上述程式碼便會輸出所有的字元數量。

8.ftell(file)

ftell 是返回當前讀檔案的指標位置,file 是檔案資源,是由 fopen 返回的物件。

9.fseek(file,offset,whence)

file

檔案系統指標,是典型地由 fopen() 建立的 resource(資源)。

offset

偏移量。

要移動到檔案尾之前的位置,需要給 offset 傳遞一個負值,並設定 whence 為 SEEK_END。

whence

SEEK_SET – 設定位置等於 offset 位元組。

SEEK_CUR – 設定位置為當前位置加上 offset。

SEEK_END – 設定位置為檔案尾加上 offset。

10.rewind($file)

回到檔案頭部,file是檔案資源

例如

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<?php

$file = fopen("1.txt","r");

echo ftell($file)."<br>"; //輸出讀取前的指標位置

echo fread($file,10)."<br>"; //讀取10個字元,指標移動10個單位

echo ftell($file)."<br>"; //輸出讀取完之後當前指標位置

fseek($file,20,SEEK_CUR); //當前指標前移20單位

echo ftell($file)."<br>"; //輸出移動之後指標的位置

echo fread($file,10)."<br>"; //輸出讀取的10個字元

echo ftell($file)."<br>"; //輸出讀完10個字元之後指標的位置

fseek($file,-20,SEEK_END); //指標移動到檔案末尾前20個字元

echo ftell($file)."<br>"; //輸出移動之後指標的位置

echo fread($file,10)."<br>"; //輸出檔案末尾20個字元

echo ftell($file)."<br>"; //輸出讀完10個字元之後指標的位置

rewind($file); //回到檔案頭部

echo ftell($file)."<br>"; //輸出移動之後指標的位置

?>

執行結果:

0
cuiqingcai
10
30
uiqingcai.
40
374
i.comcuiqi
384
0

11.flock(file,operation[,wouldblock])

file

檔案資源指標,是典型地由 fopen() 建立的 resource(資源)。

operation

operation 可以是以下值之一:

LOCK_SH取得共享鎖定(讀取的程式)。

LOCK_EX 取得獨佔鎖定(寫入的程式。

LOCK_UN 釋放鎖定(無論共享或獨佔)。

如果不希望 flock() 在鎖定時堵塞,則是 LOCK_NB(Windows 上還不支援)。

wouldblock

如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個引數會被設定為 TRUE。(Windows 上不支援)

例如

 

1

2

3

4

5

6

7

<?php

$file = fopen("1.txt","a");

if(flock($file,LOCK_EX)){

fwrite($file,"xxx");

flock($file,LOCK_UN);

}

?>