php提供了丰富的文件处理函数
文件处理主要包括:
①文件的创建/打开
②文件的写入
③文件读取
④检查文件是否存在
⑤文件的拷贝与删除
⑥获取文件的大小、类型及修改时间
fopen()函数的使用:
fopen()函数主要用来打开一个文件或url地址
语法:
resource fopen(string filename,mode);
①参数filename:尝试打开或创建的文件名
②参数mode:打开模式
注意:
1.php中没有单独的文件创建函数,创建或打开文件都是使用fopen()函数
2.当使用fopen()函数打开一个文件时,如果文件不存在,则会尝试创建该文件,并返回一个资源;如果打开失败,返回false
案例1,使用fopen()函数创建一个文件:
<?php
if(!file_exists("test.txt")){//如果文件不存在(当前目录下)
$fh=fopen("test.txt","w");//以只写模式创建一个test.txt文件
fclose($fh);//关闭文件
}
?>
案例2,使用fopen()函数打开url地址
<?php
$fh=fopen("http://www.baidu.com","r");
if($fh){
while(!feof($fh)){
echo fgets($fh);
}
}
?>
注意:fopen()返回的只是一个资源,要想显示打开的页面地址,还需要使用fgets()函数读取,并使用echo输出
fwrite()函数的使用:
fwrite()函数主要用来向文件写入字符串,如果写入成功,则返回写入的字符数,否则返回false
格式:
int fwrite(resource handle,string data,int length)
注意:fwrite()函数将data的内容写入文件指针handle处
注意:如果指定了可选参数length,当写入了length个字节或者写完了data以后,写入就会停止
案例1,写入文件:
<?php
$filename="file.txt";//要写入的文件名称
$content="你好!";//要写入的内容
$fh=fopen($filename,"w");//打开文件
$num=fwrite($fh,$content);//将内容写入文件中,返回写入的字符数
//$num=fwrite($fh,$content,4);//只能将四个字符写入到file.txt文件中
echo $num;//输出结果为:6
fclose($fh);//关闭文件
?>
案例2,追加写入:
<?php
$filename="file.txt";
$content="你好!";
$fh=fopen($filename,"a");
echo fwrite($fh,$content);
fclose($fh);//关闭文件
?>
file_put_contents()函数的使用:
file_put_content():此函数主要用于一次性将字符串写入文件或追加字符串到文件,如果成功,返回写入到文件的字符数,失败的话返回false
语法:
int file_put_content(string filename,string data,int flags,resource context);
案例1,写入文件:
<?php
echo file_put_contents("file.txt","你好");//浏览器输出结果为:4
?>
注意:
1.如果文件不存在,则创建文件,相当于fopen()函数行为
2.如果文件存在,默认将清空文件内的内容,可设置 flags 参数值为 FILE_APPEND 以避免
案例2,追加写入:
<?php
file_put_contents("file.txt","你好",FILE_APPEND);//追加内容到文件尾部
?>
文件的读取函数:
文件的读取函数主要有如下几种:
①fread():从文件中读取数据
②fgets():从文件中读取一行数据,并将文件指针指向下一行
③fgetc():逐字读取文件数据,直到文件结束
④file():把整个文件内容读取到一个数组中,数组中的每个元素都是文件中对应的一行
⑤file_get_contents():将整个文件内容读入到一个字符串
fread():此函数用于读取文件
语法:
string fread(int handle,int length);
注意:
fread()函数从文件指针handle读取最多length个字节。当遇到下列情况时,会停止读取文件
①在读取完最多length个字节数时
②达到文件末尾的时候(eof)
案例:从文件中读取10个字节
<?php
$filename = "test.txt";
$fh = fopen($filename, "r");
echo fread($fh, "10");
fclose($fh);
?>
fgets():此函数主要用来从文件中读取一行数据,并将文件指针指向下一行
语法:
string fgets(int handle,int length)
注意:
①fgets() 从 handle 指向的文件中读取一行并返回长度最多为 length-1 字节的字符串
②碰到换行符(包括在返回值中)、EOF 或者已经读取了 length-1 字节后停止
③如果没有指定 length ,则默认为 1K ,或者说 1024 字节
案例:
<?php
$fh = @fopen("test.txt","r") or die("打开 test.txt 文件出错!");
// if条件避免无效指针
if($fh){
while(!feof($fh)) {
echo fgets($fh), '<br />';
}
}
fclose($fh);
?>
feof() 函数测试文件指针是否到了文件结束的位置,该文件指针必须有效,如果是无效的资源,则会陷入无限循环中
fgetc():此函数主要用于逐字读取文件数据,直到文件结束
语法:
string fgetc(resource handle);
案例:从文件中读取10个字节
<?php
$fh = @fopen("test.txt","r") or die("打开 test.txt 文件出错!");
if($fh){
while(!feof($fh)) {
echo fgetc($fh);
}
}
fclose($fh);
?>
file():此函数主要用于把整个文件读取到一个数组中,数组中的每个单元都是文件中相应的一行,成功,返回一个数组;失败返回false
语法:
array file(string filename);
案例:从文件中读取10个字节
<?php
$lines = file('test.txt');
// 在数组中循环并加上行号
foreach ($lines as $line_num => $line) {
echo "Line #{$line_num} : ",$line,'<br />';
}
?>
test.txt 文件内容:
你好!
这是第二行文字。
浏览器显示:
Line #0 : 你好!
Line #1 : 这是第二行文字。
file_get_contents():此函数主要用于将整个文件读入到一个字符串,成功,则返回一个字符串;失败则返回false
语法:
string file_get_contents(string filename,int offset,int maxlen);
案例:
<?php
// 读取时同事将换行符转换成 <br />
echo nl2br(file_get_contents('test.txt'));
?>
file_exists():此函数主要用来检查一个文件或目录是否存在
语法:
bool file_exists(string filename);
案例:
<?php
$filename = 'test.txt';
if (file_exists($filename)) {
echo "文件 $filename 存在";
} else {
echo "文件 $filename 不存在";
}
?>
copy():此函数主要用来拷贝文件
成功返回true,失败返回false
语法:
bool copy(string file,string newfile);
案例:
<?php
if (copy('test.txt', 'test.txt.bak')) {
echo "文件拷贝成功";
} else {
echo "文件拷贝失败";
}
?>
unlink():此函数主要用来删除文件
成功返回true,失败返回false
语法:
bool unlink(string filename);
案例:
<?php
unlink("test.txt");
?>
获取文件信息的函数主要有如下几种:
①filesize():取得文件大小,成功则返回文件大小的字节数,失败返回false
②filetype():取得文件的类型,成功则返回文件的类型,可能的值有file、dir、char、block、link等
③filemtime():取得文件的修改时间,成功则返回文件上次被修改的时间戳
问题?
如何锁定文件:在向一个文本文件中写入数据时,需要先锁定文件,以防其它用户同时也修改此文件内容,如何锁定文件呢?
php中通过flock()函数实现文件锁定,语法如下:
bool flock(int handle,int operation);
参数1:是一个已经打开的文件指针
参数2:控制锁定权限,有四个可选值:
LOCK_SH:取得共享锁定(读取程序)
LOCK_EX:取得独占锁定(写入程序)
LOCK_UN:释放锁定
LOCK_NB:防止iflock()在锁定时堵塞