一、文件操作函数
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;
}
用户名:
标 题:
内 容:
提 交