在有些場合中需要以文件的形式來對內容進行存儲,通常這時候需要對文件進行一系列的操作,PHP中對於文件的操作跟其他計算機程序設計語言對文件的操作類似,對於文件的操作主要包括三個部分,以及圍繞這三部分提供的輔助性函數來完成文件操作的工作。
(1)文件的創建與打開;
(2)文件的操作;
(3)文件的關閉;
在PHP中,通過一系列的函數來完成文件的操作,常用的函數及其簡要說明羅列如下:
//文件打開,完成文件打開(在文件不存在時可創建文件),依賴於文件中模式的不同而具有不同的操作
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
//$filename 打開或者要創建文件的路徑及文件名,為了便於移植,使用反斜槓/為佳
//$mode 是文件打開的模式,有很多模式,比較常用的r,w,a,同樣為了便於移植,建議mode中增加b(二進制)
//通常讀文件為 rb ,寫文件為 ab,分別表示以二進制讀文件及以二進制向文件追加內容
//在文件打開操作過程中出現錯誤請首先檢查文件所在的路徑的權限設置
代碼如下
復制代碼
//文件操作函數
//寫操作相關函數
//把$string的內容寫到文件指針$handle
int fwrite ( resource $handle , string $string [, int $length ] )
//函數是fwrite的別名函數
fputs()
//也能完成寫操作,不同的是集成了fopen(),fwrite(),fclose(),使用該函數不用再打開關閉文件
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
//讀操作相關函數
//逐行讀取
string fgets ( resource $handle [, int $length ] )
//逐行讀,能夠過濾標記
string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] )
//逐行讀,能夠根據定界符輸出到數組
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\' ]]]] )
//一次性讀取一個文件並將文件內容發送到標准輸出,包含了文件打開與文件關閉操作
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
//先要打開文件,然後將文件指針所指向的文件內容發送到標准輸出
int fpassthru ( resource $handle )
//把結果發送到一個數組中
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
//一次讀取一個字符
string fgetc ( resource $handle )
//讀取任意長度字節的內容
string fread ( resource $handle , int $length )
//文件關閉
bool fclose ( resource $handle )
//文件操作中常用的函數
//檢查文件或目錄是否存在
bool file_exists ( string $filename )
//獲取文件大小,返回文件大小的字節數
int filesize ( string $filename )
//刪除文件
bool unlink ( string $filename [, resource $context ] )
//復位文件指針位置
bool rewind ( resource $handle )
//在文件指針中定位
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )
函數的具體詳細的說明在php.net上可以查到,下面練習一下文件的操作,練習名稱為『簡易日記』,需求如下:
(1)每日記錄的內容以年-月-日.txt保存在數據目錄下;
(2)首頁寫日記,並顯示以往的記錄;
(3)顯示單頁記錄內容;
具體代碼如下
首頁(index.php)
代碼如下
復制代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>簡易日記--php文件操作練習</title>
<style>
h1 {
font-size:24px;
border-bottom:1px solid #000;
line-height:40px;
}
.active {
line-height:22px;
font-size:14px;
background:#2cf;
padding:8px;
text-decoration:none;
}
.btn {
width:100px;
height:40px;
}
</style>
</head>
<body>
<h1>我的日記本</h1>
<p><span class="active">寫日記</span></p>
<form name="writediary" method="POST" action="diaryprocessed.php">
<p>日記主題</p>
<input type="text" name="diarytopic" size="60" maxlength="100" />
<p>日記內容</p>
<textarea name="diarycontents" rows="10" cols="53"></textarea>
<p><input class="btn" type="submit" name="save" value="保存" /></p>
</form>
<hr>
<p><span class="active">日記列表</span> </p>
<hr>
<?php
$handler = opendir($_SERVER['DOCUMENT_ROOT'] . '/phpcodes/diarydatas/');
while (($diaryname = readdir($handler)) !== false) {
if($diaryname != "." && $diaryname != ".." ) {
$files[] = $diaryname;
}
}
closedir($handler);
foreach($files as $value) {
echo "<a href=viewdiary.php?id=" . substr($value,0,(strlen($value)-4)) . ">$value</a>" . " | ";
}
?>
</body>
</html>
保存處理頁(diaryprocessed.php)
代碼如下
復制代碼
<?php
header('Content-Type:text/html; charset=utf-8');
$date = gmdate('Y-m-d', time() + 3600 * 8);
$diarytopic = $_POST['diarytopic'];
$diarycontents = $_POST['diarycontents'];
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$output = $diarytopic . "n" . $diarycontents . "n";
$fp = fopen($DOCUMENT_ROOT . '/phpcodes/diarydatas/' . $date . '.txt', 'ab');
flock($fp,LOCK_EX);
if(!$fp) {
echo "<p><strong>當前不能處理您提交的日志,請稍後再試!</strong></p>";
echo "<a href="index.htm">返回</a>";
}
fwrite($fp,$output);
flock($fp,LOCK_UN);
fclose($fp);
echo '日記提交成功!';
echo "<a href="index.htm">返回</a>";
查看內容頁(viewdiary.php)
代碼如下
復制代碼
<?php
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>簡易日記</title>
<style>
* { line-height: 32px; }
</style>
</head>
<body>
<a href="index.php">寫日記</a>
<hr>
<?php
$diaryname = $_GET['id'];
$filepath = $DOCUMENT_ROOT . '/phpcodes/diarydatas/' . $diaryname . '.txt';
if (file_exists($filepath)) {
$fp = fopen($filepath, 'rb');
echo nl2br(fread($fp,filesize($filepath)));
fclose($fp);
}
?>
</body>
</html>