程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 目錄與文件處理-鄭阿奇(續)

php 目錄與文件處理-鄭阿奇(續)

編輯:關於PHP編程

1.文件目錄操作
最頂層止錄是磁盤根目錄,用'/'或'//'
當前目錄 ./
../表示apache的目錄即htdocs目錄
1.創建與刪除目錄 mkdir
復制代碼 代碼如下:
<?php
if(mkdir("./path",0700)) //在當前目錄中創建path目錄
echo "創建成功";
?>

2.獲取和更改當前目錄
使用getcwd()函數可以取得當前的工作目錄,該函數沒有參數。成功則返回當前的工作目錄,失敗則返回FALSE
3.打開和關閉目錄句柄
opendir($dir)
closed($dir_handle)
4.讀取目錄內容
readdir(),該參數是一個已經打開的目錄句柄,與while循環可以實現對目錄的遍歷
5.獲取指定路徑中的目錄與文件 。
array scandir(string $directory [, int $sorting_order [, resource $context ]])
說明:$directory為指定路徑。參數$sorting_order默認是按字母升序排列,如果設為1表示按字母的降序排列。
$context是可選參數,是一個資源變量,可以用stream_context_create()函數生成,這個變量保存著與具體的操作對象有關的一些數據。
函數運行成功則返回一個包含指定路徑下的所有目錄和文件名的數組,失敗則返回FALSE
2.操作文件的一般方法
3.文件的打開與關閉
1.打開文件
resource fopen(string $filename , string $mode [, bool $use_include_path [, resource $context ]])
●$filename參數。fopen()函數將$filename參數指定的名字資源綁定到一個流上
●$mode參數。$mode參數指定了fopen()函數訪問文件的模式,取值見表4.5。
$mode
說 明
'r'
只讀方式打開文件,從文件頭開始讀
'r+'
讀寫方式打開文件,從文件頭開始讀寫
'w'
寫入方式打開文件,將文件指針指向文件頭。如果文件已經存在則刪除已有內容,如果文件不存在則嘗試創建它
'w+'
讀寫方式打開文件,將文件指針指向文件頭。如果文件已經存在則刪除已有內容,如果文件不存在則嘗試創建它
'a'
寫入方式打開文件,將文件指針指向文件末尾,如果文件已有內容將從文件末尾開始寫。如果文件不存在則嘗試創建它
'a+'
讀寫方式打開文件,將文件指針指向文件末尾。如果文件已有內容將從文件末尾開始讀寫。如果文件不存在則嘗試創建它
'x'
創建並以寫入方式打開文件,將文件指針指向文件頭。如果文件已存在,則fopen()調用失敗並返回FALSE,並生成一條E_WARNING級別的錯誤信息。如果文件不存在則嘗試創建它。此選項被PH及以後的版本所支持,僅能用於本地文件
'x+'
創建並以讀寫方式打開文件,將文件指針指向文件頭。如果文件已存在,則fopen()調用失敗並返回FALSE,並生成一條E_WARNING級別的錯誤信息。如果文件不存在則嘗試創建它。此選項被PH及以後的版本所支持,僅能用於本地文件
'b'
二進制模式,用於連接在其他模式後面。如果文件系統能夠區分二進制文件和文本文件(Windows區分,而UNIX不區分),則需要使用到這個選項,推薦一直使用這個選項以便獲得最大程度的可移植性

●$use_include_path參數。如果需要在include_path(PHP的include路徑,在PHP的配置文件設置)中搜尋文件,
可以將可選參數 $use_include_path的值設為1或TRUE,默認為FALSE。
●$context參數。可選的$context參數只有文件被遠程打開時(如通過HTTP打開)才使用,它是一個資源變量,
其中保存著與fopen()函數具體的操作對象有關的一些數據。如果fopen()打開的是一個HTTP地址,
那麼這個變量記錄著HTTP請求的請求類型、HTTP版本及其他頭信息;如果打開的是FTP地址,
記錄的可能是FTP的被動/主動模式
2.關閉文件
bool fclose(resource $handle)
4.文件的寫入
文件寫入前需打開文件,不存在先創建它,一般用fopen()函數創建
●fwrite().文件打開後,向文件寫入內容
int fwrite(resource $handle , string $string [, int $length ])
說明:參數$handle是寫入的文件句柄,
$string是將要寫入文件中的字符串數據,
$length是可選參數,如果指定了$length,則當寫入了$string中的前$length個字節的數據後停止寫入。
●file_put_contents()函數。PHP 5還引入了file_put_contents()函數。這個函數的功能與依次調用fopen()、fwrite()及fclose()函數的功能一樣。語法格式如下:
int file_put_contents(string $filename , string $data [, int $flags [, resource $context ]])
說明:$filename是要寫入數據的文件名。
$data是要寫入的字符串,$data也可以是數組,但不能為多維數組。
在使用FTP或HTTP向遠程文件寫入數據時,可以使用可選參數$flags和$context,這裡不具體介紹。
寫入成功後函數返回寫入的字節數,否則返回FALSE。
●fputcsv()函數。CSV是一種比較常用的文件格式,一般以.csv作為擴展名。CSV格式把文件的一行看做是一條記錄,記錄裡的字段使用逗號分隔。
在PHP中使用 fputcsv()函數可以把指定的數組格式化為符合CSV文件格式的內容,並寫入文件指針指向的當前行。語法格式如下:
int fputcsv(resource $handle [, array $fields [, string $delimiter [, string $enclosure ]]])
說明:參數$handle是要寫入的文件句柄。
參數$fields是要格式化的數組。
可選的$delimiter參數用於設定字段分界符(只允許一個字符),默認為逗號。
可選的$enclosure參數設定字段環繞符(只允許一個字符),默認為雙引號
5 文件的讀取
1.讀取任意長度
fread()函數可以用於讀取文件的內容,語法格式如下:
string fread(int $handle, int $length)
說明:參數$handle是已經打開的文件指針,
$length是指定讀取的最大字節數,$length的最大取值為8192。
如果讀完$length個字節數之前遇到文件結尾標志(EOF),則返回所讀取的字符,並停止讀取操作。
如果讀取成功則返回所讀取的字符串,如果出錯返回FALSE。
注意:在讀取文件後顯示文件內容時,文本中可能含有無法直接顯示的字符,如HTML標記。
這時需要使用htmlspecialchars()函數將HTML標記轉化為實體才能顯示文件中的字符。
2.讀取整個文件
●file()函數。file()函數用於將整個文件讀取到一個數組中,語法格式如下:
array file(string $filename [, int $use_include_path [, resource $context ]])
說明:本函數的作用是將文件作為一個數組返回,數組中的每個單元都是文件中相應的一行,包括換行符在內,
如果失敗則返回FALSE。參數$filename是讀取的文件名,參數$use_inclue_path和$context的意義與之前介紹的相同
●readfile()函數。readfile()函數用於輸出一個文件的內容到浏覽器中,語法格式如下:
int readfile(string $filename [, bool $use_include_path [, resource $context ]])
●fpassthru()函數。fpassthru()函數可以將給定的文件指針從當前的位置讀取到EOF,並把結果寫到輸出緩沖區。
要使用這個函數,必須先使用fopen()函數打開文件,然後將文件指針作為參數傳遞給fpassthru()函數,
fpassthru()函數把文件指針所指向的文件內容發送到標准輸出。如果操作成功返回讀取到的字節數,否則返回FALSE。
●file_get_contents()函數。file_get_contents()函數可以將整個或部分文件內容讀取到一個字符串中,
功能與依次調用fopen()、fread()及fclose()函數的功能一樣。語法格式如下:
string file_get_contents(string $filename [, int $offset [, int $maxlen ]])
說明:$filename是要讀取的文件名,可選參數$offset可以指定從文件頭開始的偏移量,
函數可以返回從$offset所指定的位置開始長度為$maxlen的內容。如果失敗,函數將返回FALSE

3. 讀取一行數據
●fgets()函數。fgets()函數可以從文件中讀出一行文本,語法格式如下:
string fgets(int $handle [, int $length ])
說明:$handle是已經打開的文件句柄,可選參數$length指定了返回的最大字節數,考慮到行結束符,
最多可以返回length-1個字節的字符串。如果沒有指定$length,默認為1024個字節
●fgetss()函數與fgets()基本相同,不過fgetss()函數會嘗試從讀取的文本中去掉任何html和php標記。
●fgetcsv()函數。fgetcsv()函數可以讀取指定文件的當前行,使用CSV格式解析出字段,並返回一個包含這些字段的數組。
語法格式如下:
array fgetcsv(int $handle [, int $length [, string $delimiter [, string $enclosure ]]])
4. 讀取一個字符
fgetc()函數。fgetc()函數可以從文件指針處讀取一個字符,語法格式為:
string fgetc(resource $handle)
該函數返回$handle指針指向的文件中的一個字符,遇到EOF則返回FALSE
5. 使用指定格式讀取文件
fscanf()函數。fscanf()函數可以讀取文件中的數據,並根據指定的格式進行格式化,並返回一個數組。語法格式如下:
mixed fscanf(resource $handle , string $format [, mixed &$... ])
格式字符串中的任何空白會與輸入流中的任何空白匹配。
這意味著甚至格式字符串中的制表符“\t”也會與輸入流中的一個空格字符匹配。
6.文件的上傳與下載
1.文件上傳
文件上傳可以通過提交html表單來實現。文件上傳結束後,默認存儲在臨時目錄中,這時必須從臨時目錄中刪除或移動到其他地方
使用PHP的move_uploaded_file()將其移到其它位置上
move_uploaded_file()函數語法格式如下:
bool move_uploaded_file(string $filename , string $destination)
注意:在將文件移動之前需要檢查文件是否是通過HTTP POST上傳的,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,
這時需要使用is_uploaded_file()函數。該函數的參數為文件的臨時文件名,若文件是通過HTTP POST上傳的,則函數返回TRUE。
例4.5 將由HTML表單上傳的GIF圖片文件移動到html目錄中
復制代碼 代碼如下:
<form enctype="multipart/form-data" action="" method="post">
<input type="file" name="myFile">
<input type="submit" name="up" value="上傳文件">
</form>
<!-- HTML表單 -->
<?php
if(isset($_POST['up']))
{
if($_FILES['myFile']['type']=="image/gif") //判斷文件格式是否為GIF
{
if($_FILES['myFile']['error']>0) //判斷上傳是否出錯
echo "錯誤:".$_FILES['myFile']['error']; //輸出錯誤信息
else
{
$tmp_filename=$_FILES['myFile']['tmp_name']; //臨時文件名
$filename=$_FILES['myFile']['name']; //上傳的文件名
$dir="html/";
if(is_uploaded_file($tmp_filename)) //判斷是否通過HTTP POST上傳
{
if(move_uploaded_file($tmp_filename,$dir.$filename)) //上傳並移動文件
{
echo "文件上傳成功!";
//輸出文件大小
echo "文件大小為:". ($_FILES['myFile']['size']/1024)."kb";
}
else
echo "上傳文件失敗!";
}
}
}
else
{
echo "文件格式非GIF圖片!";
}
}
?>

2.文件下載
header()函數的作用是向浏覽器發送正確的HTTP報頭,報頭指定了網頁內容的類型、頁面的屬性等信息。
header()函數的功能很多,這裡只列出以下幾點:
●頁面跳轉。如果header()函數的參數為“Location: xxx”,頁面就會自動跳轉到“xxx”指向的URL地址。例如:
header("Location: http://www.baidu.com"); //跳轉到百度頁面
header("Location: first.php"); //跳轉到工作目錄的first.php頁面
●指定網頁內容。例如,同樣的一個XML格式的文件,如果header()函數的參數指定為“Content-type: application/xml”,
浏覽器會將其按照XML文件格式來解析。但如果是“Content-type: text/xml”,浏覽器就會將其看做文本解析。
header()函數結合readfile()函數可以下載將要浏覽的文件
7.其他常用文件函數
1.計算文件大小
filesize()函數用於計算文件的大小,以字節為單位
filesize()函數結合fread()函數可以實現一次讀取整個文件
2.判斷文件是否存在
file_exits()
is_dir()函數用於判斷給定文件名是否是目錄
is_file()函數用於判斷給定文件名是否是文件。
is_readable()函數用於判斷給定文件是否可讀。
is_writeable()用於判斷給定的文件是否可寫
3.刪除文件
unlink()
4.復制文件
bool copy(string $source,string $dest),如果目示文件已存在,則將被覆蓋
5.移動、重命名文件
除了move_uploaded_file()函數,還有一個rename()函數也可以移動文件。
語法格式如下:
bool rename ( string $oldname , string $newname [, resource $context ] )
說明:rename()函數主要用於對一個文件進行重命名,$oldname是文件的舊名,$newname為新的文件名。
當然,如果$oldname與$newname的路徑不相同,就實現了移動該文件的功能
6.文件指針操作
PHP中有很多操作文件指針的函數,如rewind()、ftell()、fseek()函數等。之前用過的feof()函數用於測試文件指針是否處於文件尾部,
也屬於文件指針操作函數。
rewind()函數。用於重置文件的指針位置,使指針返回到文件頭。它的參數只有一個,就是已經打開的指定文件的文件句柄。
ftell()函數。可以以字節為單位,報告文件中指針的位置,也就是文件流中的偏移量。它的參數也是已經打開的文件句柄。
fseek()函數。可以用於移動文件指針,語法格式如下:
int fseek ( resource $handle , int $offset [, int $whence ] )
例4.8 投票統計
復制代碼 代碼如下:
<form enctype="multipart/form-data" action="" method="post">
<table border="0">
<tr><td bgcolor="#CCCCCC">
<font size=4 color=blue>當前最流行的Web開發語言:</font>
</td></tr>
<tr><td><input type="radio" name="vote" value="PHP">PHP</td></tr>
<tr><td><input type="radio" name="vote" value="ASP">ASP</td></tr>
<tr><td><input type="radio" name="vote" value="JSP">JSP</td></tr>
<tr><td><input type="submit" name="sub" value="請投票"> </td></tr>
</table>
</form>
<?php
$votefile="EX4_6_vote.txt"; //用於計數的文本文件$votefile
if(!file_exists($votefile)) //判斷文件是否存在
{
$handle=fopen($votefile,"w+"); //不存在則創建該文件
fwrite($handle,"0|0|0"); //將文件內容初始化
fclose($handle);
}
if(isset($_POST['sub']))
{
if(isset($_POST['vote'])) //判斷用戶是否投票
{
$vote=$_POST['vote']; //接收投票值
$handle=fopen($votefile,"r+");
$votestr=fread($handle,filesize($votefile)); //讀取文件內容到字符串$votestr
fclose($handle);
$votearray=explode("|", $votestr); //將$votestr根據“|”分割
echo "<h3>投票完畢!</h3>";
if($vote=='PHP')
$votearray[0]++; //如果選擇PHP,則數組第1個值加1
echo "目前PHP的票數為:<font size=5 color=red>".$votearray[0]."</font><br>";
if($vote=='ASP')
$votearray[1]++; //如果選擇ASP,則數組第2個值加1
echo "目前ASP的票數為:<font size=5 color=red>".$votearray[1]."</font><br>";
if($vote=='JSP')
$votearray[2]++; //如果選擇JSP,則數組第3個值加1
echo "目前JSP的票數為:<font size=5 color=red>".$votearray[2]."</font><br>";
//計算總票數
$sum=$votearray[0]+$votearray[1]+$votearray[2];
echo "總票數為:<font size=5 color=red>".$sum."</font><br>";
$votestr2=implode("|",$votearray); //將投票後的新數組用“|”連接成字符串$votestr2
$handle=fopen($votefile,"w+");
fwrite($handle,$votestr2); //將新字符串寫入文件$votefile
fclose($handle);
}
else
{
echo "<script>alert('未選擇投票選項!')</script>";
}
}
?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved