一、文件操作函數
1.創建文件:touch('./xxx.php');
bool touch ( string $filename [, int $time = time() [, int $atime ]] )
2.復制文件:copy('./xxx.php','./yyy.php');
3.移動或重命名:rename('./xxx.php','./yyy.php');
4.刪除文件:unlink('./xxx.php');
5.截取文件:ftruncate('./xxx.php',$size);
6.文件內容操作:
a.file_get_contents('./xxx.php');獲取文件
b.file_put_contents('./xxx.php','aaa');寫入文件
注:可以遠程讀取文件,如:file_put_contents('./xxx.php',file_get_contents('http://www.baidu.com'));
C.讀文件readfile('http://www.baidu.com');
d.$arr=file('./xxx.php'):將文件存為數組,每一行是一個元素
注:以上涉及讀取文件內容的函數無需先打開文件
二、文件的打開與關閉
1.$open=fopen('./xxx.php','r');
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
注:附加Mode:b操作二進制文件時加上,t文本文件
2.fclose($open);
3.fwrite($open,'aaaa');可以更改fopen的mode,改變每次寫入是否覆蓋
4.fgetc($open);一次讀取文件一個字符
5.feof($open);指針到文件結尾返回true,可用作if判斷
6.fgets($open);一次讀取文件一行
7.fread($open,1024);一次讀取指定長度(字節數)的字符
注:以上讀取文件內容必須先打開文件
while(!feof($open)){
echo fgetc($open);
echo fgets($open);
echo fread($open,filesize($open));
}
三、移動文件的指針
1.ftell($open);返回指針當前位置,默認為開始
2.fseek($open,-4,SEEK_END);將指針移動至某位置,如從文件尾前移4個字節,注意結尾可能有換行符。可以配合fopen的a追加模式更方便的操作
$whence值可以是:
?SEEK_SET - 設定位置等于 offset 字節。
?SEEK_CUR - 設定位置為當前位置加上 offset。
?SEEK_END - 設定位置為文件尾加上 offset。
3.rewind($open);將指針放到開頭
四、文件的鎖定機制
1.flock($open,LOCK_SH):讀取/寫入文件時都需要鎖定(LOCK_SH/LOCK_EX),以防止多人同時操作,解鎖時方法相同(LOCK_UN)
注:$handle必須指向一個打開的文件資源
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
operation 可以是以下值之一:
? LOCK_SH取得共享鎖定(讀取的程序)。
? LOCK_EX 取得獨占鎖定(寫入的程序。
? LOCK_UN 釋放鎖定(無論共享或獨占)。
五、實例:留言板
$filename='message.txt';
if(isset($_POST['dosubmit'])){
$content="{$_POST['username']}||".time()."||{$_POST['title']}||{$_POST['content']}[n]";
writeMessage($filename,$content);
}
if(file_exists($filename)){
date_default_timezone_set('PRC');
readMessage($filename);
}
function writeMessage($filename,$content){
$open=fopen($filename,'a');
if(flock($open,LOCK_EX+LOCK_NB)){//添加寫入鎖及防阻塞
fwrite($open,$content);
flock($file,LOCK_UN+LOCK_NB);//釋放寫入鎖及防阻塞
}else{
echo "寫入鎖定失敗!";
}
fclose($open);
}
function readMessage($filename){
//不打開文件讀取,無法加鎖
//$mess=rtrim(file_get_contents($filename),'[n]');
$mess='';
$file=fopen($filename,'r');
if(flock($file,LOCK_SH+LOCK_NB)){//添加讀取鎖及防阻塞
while(!feof($file)){
$mess.=fread($file,1024);
}
flock($file,LOCK_UN+LOCK_NB);//釋放讀取鎖及防阻塞
}else{
echo "讀取鎖定失敗!";
}
$mess=rtrim($mess,'[n]');
$arr=explode('[n]',$mess);
foreach($arr as $value){
list($username,$time,$title,$content)=explode("||",$value);
echo "{$username},".date('y-m-d h:i',$time).":{$title},{$content}
";
}
fclose($file);
}
?>
input{
display: block;
}
textarea{
display: block;
}
用戶名:
標???題:
內???容:
提?交