PHP檔案處理

PHP 擁有的多種函數可供建立、讀取、上傳以及編輯檔案。

注意:請謹慎操作檔案!

當您操作文件時必須非常小心。如果您操作失誤,可能會造成非常嚴重的破壞。

常見的錯誤是:

  1.編輯錯誤的檔案

  2.被垃圾資料填滿硬碟

  3.意外刪除檔案內容


PHP readfile()函數


##readfile

($檔名) 

#功能
:傳入一個檔案路徑,輸出一個檔案

例如有個名為file.txt 的文件,內容如下 

 Welcome in the PHP Chinese learning PHP

 

用readfile()函數讀取此檔案並寫入輸出流的PHP 程式碼如下(如讀取成功則readfile() 函數傳回位元組數):

 
位元組數:英文佔一個位元組  gbk編碼中文佔2個  utf-8中文佔3個  空格和符號佔1個

<?php
echo readfile("D:WWW/item/file.txt");
?>
程式運作結果:

#Welcome in the PHP中文 learning PHP39

file_get_contents開啟檔案

上面的是單純打文件就直接輸出了,有沒有開啟檔案後,能夠賦值給一個變數的操作方式呢。 PHP當然會提供這種方式。這個方式就是PHP開啟檔案並回傳內容的方式之一,讓我們來看看函數:


file_get_contents
## ( string filename)

#功能:傳入一個檔案或檔案路徑,開啟這個檔案回傳檔案的內容。文件的內容是一個字串。

例如  有個file.txt 的文件,內容如下:

### ###I use the file_get_contents open###### ############使用file_get_contents 開啟#########
<?php
$fileName="file.txt";
$filestring = file_get_contents($fileName);
echo $filestring;
?>
#########程式執行結果:############ I use the file_get_contents open############ ###

fopen、fread、fclose操作讀取檔案

#fopen ($檔名, 模式)

fread

($操作資源, 讀取長度)

fclose

($操作資源)

透過上面的函數我們來講解資源類型的通常操作方式:

##1.  開啟資源

2.  使用相關函數操作

#3.  關閉資源

fopen

#函數fopen函數的功能是開啟文件,參數主要有兩個:

1.  檔案開啟的路徑2.  開啟檔案的模式      資源類型需要其他的函數來操作這個資源。所有的資源有開啟就要有關閉。

fread#函數 函數的功能的功能是讀取開啟的檔案資源。讀取指定長度的檔案資源,讀取一部分向後移動一部分。至到文件結尾。

fclose函數 fclose函數的功能是關閉資源。資源有開啟就有關閉。

 模式        說明 r##只讀。在文件的開頭開始。
 fopen的模式(下表):        


  r+

讀取/寫入。在文件的開頭開始。

  w#########只寫。開啟並清空文件的內容;如果文件不存在,則建立新文件。 ###############    ####

  w+

讀/寫。開啟並清空文件的內容;如果文件不存在,則建立新文件。

     

  a

追加。開啟並向文件末尾進行寫入操作,如果文件不存在,則建立新文件。
  a+讀取/追加。透過向文件末尾寫內容,來保持文件內容。

   

  x

只寫。建立新文件。如果檔案已存在,則傳回 FALSE 和一個錯誤。

  

  x+

讀/寫。建立新文件。如果檔案已存在,則傳回 FALSE 和一個錯誤。
  twindows下將\n轉為\r\n
#     b二進位開啟模式
#

1.開啟檔案

#file.txt 檔案的內容如下

You're welcome

#
<?php
//你可以创建一个file.txt,以只读模式打开
$fp = fopen('file.txt', "r");
//var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
var_dump($fp);
?>

2.讀取檔案

<?php
$fp = fopen('file.txt', "r");
//打开一个文件类型后,读取12个字节
$contents = fread($fp, 12);
?>

 3,關閉檔案

#
<?php
$fp = fopen('file.txt', 'r');
$contents = fread($fp, 1024);
fclose($fp);
echo $contents;
?>

程式執行結果:

 You're welcome


#file_put_contents和fwrite寫入檔案



  file_put_contents ( string $檔案路徑, string $寫入資料])

 功能:寫入指定的檔案中寫入一個字串,如果文件不存在則建立文件。傳回的是寫入的位元組長度


#

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$data = "我是一个兵,来自老百姓";
$numbytes = file_put_contents('binggege.txt', $data);
if($numbytes){
    echo '写入成功,我们读取看看结果试试:';
    echo file_get_contents('binggege.txt');
}else{
    echo '写入失败或者没有权限,注意检查';
}
?>
程式運行結果:

 寫入成功,我們讀取看看結果試試:我是一個兵,來自老百姓

fwrite

( resource $檔案資源變數, string $寫入的字串[, int 長度])

  

:fwrite的別名函數是fputs

我們上面試了r模式,只道是讀取的時候使用,接下來我們用fwrite加上fopen中的w,寫入模式來進行檔案寫入

實例



你可以試試看新個test.txt檔案向裡面寫入內容。然後,可以試試看把test.txt刪除。看看有什麼提示。

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
fclose($fp);
print $len ."字节被写入了\n";
?>

######程式運行結果:##########66位元組被寫入了########### ################總結:######### 1.無論有沒有新建都會開啟檔案重新寫入### 2.原有的檔案內容會被覆寫### 3.檔案不存在會建立###############比較以下幾個模式的不同:########
  模式  說明

#################################### ######  r######只能讀不能使用fwrite寫############  r+######可操作讀取、寫###### ######  w######只可以寫功能#############  w+#########即可讀取又可以寫##### ##########

實例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
$fp= fopen($filename, "r");
$len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
fclose($fp);
print $len .'字节被写入了\n';
?>

#程式執行結果:

 0位元組被寫入了\n

我們發現只用r 的話寫入是不成功的


建立臨時檔案

我們先前建立的檔案都是永久檔案。

而建立臨時檔案在我們平常的專案開發中也非常有用。建立臨時檔案的幾個好處

1.    用完後即刪除

#2.    不需要去維護這個檔案的刪除狀態

例如:我需要把A的文件內容轉存B裡面,把B的文件內容轉存到C裡面。

就跟現實生活中一樣,我可以先用一個臨時的瓶子把B的水裝起來,然後把A的資料寫入B裡面。把臨時瓶子的水追加到C裡面。

我們來學習這個函數:

resource tmpfile ( )

功能:建立一個暫存文件,傳回資源類型。關閉檔案即被刪除。

實例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$handle = tmpfile();
//向里面写入了数据
$numbytes = fwrite($handle, '写入临时文件的内容');
//关闭临时文件,文件即被删除
fclose($handle);
echo  '向临时文件中写入了'.$numbytes . '个字节';
?>

#程式執行結果:

<?php
$fileName1="text.txt";
$fileName2="text--1.txt";
rename($fileName1,$fileName2);
?>
寫入了27個位元組


移動,拷貝,刪除檔案

重新命名檔案

rename($舊名,$新名稱);

這個函數傳回一個bool值,將舊的名字改為新的名字。

實例

<?php
$filename = 'file.txt';  //旧文件名
$filename2 = 'copy-file.txt';  //新文件名
copy($filename, $filename2);    //修改名字。
?>

上面的例子就是將一個text.txt的檔案改名為text--1.txt 的例子,你不妨可以試試


複製檔案

copy(來源文件,目標文件)

功能:將指定路徑的來源文件,複製一份到目標文件的位置。

實例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'test.txt';
unlink($filename);
?>

#上面的範例是將一個檔案名稱為file.txt的文件,複製一份名為copy-file.txt 的文件,內容相同。


刪除檔案

 unlink (指定路徑的檔案)

實例

<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'file.txt';
echo $filename . '文件大小为: ' . filesize($filename) . ' bytes';
?>

上面的範例是將一個檔案名稱為test.txt的檔案刪除


檔案常用的函數

filesize 偵測檔案的大小

實例

<?php
//以增加的r模式打开
$fp = fopen('text.txt','r+');
//你分发现每次只读一个字符
echo  fgetc($fp) ."<br>";
//我要全部读取可以,读取一次将结果赋值一次给$string
while($string = fgetc($fp)){
    echo $string;
}
?>

程式執行結果:

#file.txt檔案大小為: 14 bytes

#其他操作檔案的函數,讀取檔案

##  函數名稱  #功能
################################################################################################################################################################### ######  file######把整個檔案讀入一個陣列中############  fgets######從檔案指標讀取一行,讀到最後返回false############  fgetc#######從檔案指標讀取一個字符,讀到最後回傳false#############  ftruncate# #####將檔案截斷到給定的長度############


我們透過一個實例來把上面幾個函數都用到。

我們在text.txt檔案中寫入一批檔案:

abcdeefghijklk
opqrst
# uvwxyz
12345678

fgetc每次讀取一個

<?php
//以增加的r模式打开
$fp = fopen('text.txt','r+');
//你分发现每次只读一个字符
echo  fgets($fp)."<br>";
echo  fgets($fp)."<br>";
echo  fgets($fp)."<br>";
echo  fgets($fp);
?>

程式運行結果:

# a
bcdeefghijklk opqrst uvwxyz 12345678

fgets每次開啟一行:

<?php
//打开我们上面的text.txt文件
$file = fopen("text.txt", "a+");
//你可以数数20个字有多长,看看是不是达到效果了
echo ftruncate($file,10);
fclose($file);
?>

##fgets每次開啟一行:


<?php
header("Content-type:text/html;charset=utf-8");    //设置编码
$filename = 'text.txt';

if (file_exists($filename)) {
    echo "$filename"."文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename))."<br>";

    echo "$filename"."文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename))."<br>";

    echo "$filename"."文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename));
}

?>


#fgets每次開啟一行:


<?php
//设置打开的目录是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 />';
        echo readdir($dh).'<br />';
        echo readdir($dh).'<br />';
        //读取到最后返回false
        //关闭文件夹资源
        closedir($dh);
    }
}
?>

#fgets每次開啟一行:

<?php
//设置打开的目录是D盘
$dir = "D:/";
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        //读取到最后返回false,停止循环
        while (($file = readdir($dh)) !== false) {
            echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
        }
        closedir($dh);
    }
}
?>

#fgets每次開啟一行:

<?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 '文件扩展名:'.$path_parts['extension']."<br />";
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />";
?>

#」執行結果:


abcdeefghijklk

opqrst uvwxyz 12345678

檔截取函數

######################################################### ######
<?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>";
?>
###############運行程序,可以開啟text.txt 文件,看看是不是有20的位元組######## #######檔案的時間函數########################################函數############   #######功能說明##################    filectime#######  檔案建立時間# ###########    filemtime######  檔案修改時間############    fileatime#######  檔案上造訪時間##### #######

實例

<?php
$a=dirname(__FILE__);
echo$a;
?>

程式運行結果:

text.txt檔案的上次訪問時間是: 2016-09-13 17:44:40
text.txt檔案的建立時間是: 2016-09-13 17:32:16
text.txt檔案的修改時間是: 2016-09 -13 17:44:55


目錄處理函數

之前我們處理的全都是文件,那目錄和資料夾怎麼處理呢?

我們就來學習目錄或稱為資料夾的處理相關函數。

處理資料夾的基本想法如下:

#1.    讀取某個路徑的時候判斷是否是資料夾

2.    是資料夾的話,開啟指定資料夾,返回檔案目錄的資源變數

3.    使用readdir讀取一次目錄中的文件,目錄指標向後偏移一次

4.    使用readdir讀取到最後,沒有可讀的檔案回傳false

5.    關閉檔案目錄

我們來學習一下比較常用函數:


      函數名稱       功能
  opendir#開啟資料夾,回傳操作資源
  readdir 讀取資料夾資源
  is_dir判斷是否為資料夾
  closedir關閉資料夾操作資源
  filetype顯示是資料夾還是文件,檔案顯示file,資料夾顯示dir


#實例

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
?>

可以執行程序,看看是不是你電腦D碟的目錄


#判斷檔案的類型

<?php
//定义一个关联数组
$data = [
    'username'=>'liwenkai',
    'area'=>'hubei',
    'pwd'=>'123'
];
//生成query内容
echo http_build_query($data);
?>

運行程式看看


檔案路徑函數

#我們常常會遇到處理檔案路徑的情況。

例如:

1.    檔案後綴需要取出來

2.    路徑需要取出名字不取目錄

3.    只需要取出路徑名中的目錄路徑

4.    或將網址中的各部份解析取得獨立值

5.    甚至是自己組成一個url出來

很多地方都需要用路徑處理類別的函數。

我們把常用的路徑處理函數為大家做了標註,大家對著這個路徑處理函數進行處理即可:

##       ## pathinfo basename    dirname    parse_url#
 函數名稱  功能
回傳文件的各個組成部分
傳回檔案名稱
#檔案目錄部
 網址拆解成各部份
##   http_build_query#產生url 中的query字串   http_build_url#產生一個url
   http_build_query
###   http_build_url#######產生一個url####################################################。 ##########

pathinfo

 pathinfo ( string $路徑)
功能:傳入檔案路徑回傳檔案的各個組成部份

實例

rrreee

程式運行結果:

檔案目錄名稱:D:/www
檔案全名:a.html
檔案副檔名:html
不包含擴充功能的檔案名稱:a


basename

basename ( string $路徑[, string $suffix ])
功能:傳入路徑回傳檔名
第一個參數傳入路徑。
第二個參數,指定我檔案名稱到了指定字元停止。

實例

rrreee

程式運行結果:

 1: a.html
 2: include
 3: text.txt


dirname

dirname(string $路徑) 
功能:傳回檔案路徑的檔案目錄部份

實例##rrreee

執行一下你的程式


parse_url

parse_url ( string $路徑)功能:將網址拆解成各部份

實例rrreee

程式運作結果:

 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 $需要處理的資料) 功能:產生url 中的query字串

實例

rrreee

#程式執行結果:

username= liwenkai&area=hubei&pwd=123


PHP Filesystem 參考手冊

#如需查看PHP 檔案系統函數的完整參考手冊,請造訪我們的PHP Filesystem 參考手冊。


繼續學習
||
<?php header("Content-type:text/html;charset=utf-8"); $data = "我是一个兵,来自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '写入成功,我们读取看看结果试试:'; echo file_get_contents('binggege.txt'); }else{ echo '写入失败或者没有权限,注意检查'; } ?>