zhangjih 发表于 2010 年 10 月 2 日 18:43:34

PHP教程最基础介绍--文件的操作


操作文件是在PHP程序经常要做的事,在这简单的介绍一些操作文件的方法,包括文件的储存,读出,插入新记录,删除其中一条记录等:
操作文件经常要用到的函数
fopen()//打开一个文件
fclose()//关闭一个文件
copy()//复制一个文件
feof()//判断文件指针是否到了最后
file_exists()//判断文件是否存在
file()//把整个文件读入一个数组 * 很有用
flock()//琐定文件
fread()//读取整个文件
fwrite()//写入文件,也可用来新建文件
unlink()//删除文件
其中我个人觉得fwrite和file是最有用的
fopen()有很多参数需要注意,可以查手册找到
    mode 说明
    'r' 只读方式打开,将文件指针指向文件头。
    'r+' 读写方式打开,将文件指针指向文件头。
    'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。假设文件不存在则尝试创建之。
    'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。假设文件不存在则尝试创建之。
    'a' 写入方式打开,将文件指针指向文件末尾。假设文件不存在则尝试创建之。
    'a+' 读写方式打开,将文件指针指向文件末尾。假设文件不存在则尝试创建之。
    'x' 创建并以写入方式打开,将文件指针指向文件头。假设文件已存在,则 fopen() 调用失败并返回 FALSE,并生成 一条 E_WARNING 级别的错误信息。假设文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
    'x+' 创建并以读写方式打开,将文件指针指向文件头。假设文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。假设文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
fwrite()是写入文件,在这给个比较好用的函数,是fwrite的增强版,呵呵
function writetofile($file_name,$data,$method="w") {
$filenum=fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
用法很容易吧,应该能看懂,和fwrite一样的用法,但其中包含了fopen,flock,fclose,很实用
file()是把整个文件读入一个数组
例如把一个文件当成数据库来使用,一般都要用到这个函数
它能一行一行的读取文本,这样我们就可以把每条记录存成一行,然后读取,后面给出的例子可以看见它的使用方法
操作文件当然少不了对字符串的操作
其中一般会用到
explode()和implode()两个函数
第一个是用来根据关键字分割字符串的,第二个刚好相反,是用关键字把字符串连成一个整体的
下面是手册上的两个小例子
[*]<?php[*]$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";[*]$pieces = explode(" ", $pizza);[*]echo $pieces; // piece1[*]echo $pieces; // piece2[*]?>
复制代码
[*]<?php[*]$array = array('lastname', 'email', 'phone');[*]$comma_separated = implode(",", $array);[*]echo $comma_separated; // lastname,email,phone[*]?>
复制代码
实例:(一个简单的文件读写)
[*]<?php[*]function writetofile($file_name,$data,$method="w") {[*]      $filenum=fopen($file_name,$method);[*]      flock($filenum,LOCK_EX);[*]      $file_data=fwrite($filenum,$data);[*]      fclose($filenum);[*]      return $file_data;[*]}[*][*]function readfromfile($file_name) {[*]      menu_idif (file_exists($file_name)) {[*]      menu_idmenu_id$file_data=file_get_contents($file_name);[*]      menu_idmenu_idreturn $file_data;[*]      menu_id}[*]}[*][*]$filename="phzzy.txt";[*][*]//下面数据后的\n为换行符,为了用file函数做准备,字符|为分割符,为explode函数做准备[*]$filedata_1="phzzy|http://www.flashforweb.com|copyright2005!\n";[*]$filedata_2="a-fei|http://www.flashforweb.com/a-fei|copyright 2004-2005\n";[*]$filedata_3="xxxx|http://www.somesite.com|no copyright!\n";[*]$filedata_4="yyyy|http://www.nosite.com|No copyright!\n";[*][*]writetofile($filename,$filedata_1);//把$filedata_1写入$filename中,假设$filename不存在它会自动生成这个文件,假设存在则将文件里的内容全部删除然后在写入$filedata_1[*]//此时phzzy.txt文件中会出现,并且里面的数据为$filedata_1[*][*]$content_1=readfromfile($filename);[*]echo $content_1;[*]echo "<hr>";[*][*]//下面是向文件末尾插入一行记录[*]$temp=readfromfile($filename);//先读取全部记录[*]writetofile($filename,$filedata_2 . $temp);//写入记录[*][*]$content_2=readfromfile($filename);[*]echo $content_2;[*]echo "<hr>";[*][*]//下面是向文件最开始插入一条记录[*]$temp=readfromfile($filename);//先读取全部记录[*]writetofile($filename,$temp . $filedata_3);//写入记录[*][*]$content_3=readfromfile($filename);[*]echo $content_3;[*]echo "<hr>";[*][*]//下面是向文件第三行插入一条记录[*]$all=file($filename);[*]$allcount=count($all);[*]for($i=0;$i<$allcount;$i++){[*]      menu_id$wdata.=$all[$i];[*]      menu_idif($i==1) $wdata.=$filedata_4;[*]}[*]writetofile($filename,$wdata);[*][*]$content_4=readfromfile($filename);[*]echo $content_4;[*]echo "<hr>";[*][*][*]//最后介绍explode和implode的用法[*][*]//先用explode按格式循环输出所有数据,现在文本中总共有4条数据[*]$all=file($filename);[*]$allcount=count($all);[*]for($i=0;$i<$allcount;$i++){[*]      menu_id$show_array=@explode("|", $all[$i]);//用|做为分割符号,然后分别用数组$show_array储存,每次分割的是第$i行的数据[*]      menu_idecho "Name: ".$show_array."<br>";[*]      menu_idecho "Website: "."<a href=".$show_array.">".$show_array."</a><br>";[*]      menu_idecho "Copyright: ".$show_array."<br><br><br>";[*]}[*][*]//implode和explode的用法刚好相反,一般是接收到用户传过来的分散的值把它组合成一个整体的值,然后在文本中存成一行,具体大家自己弄弄拉,可以看implode那个小例子[*][*]?>
复制代码
补充::
一些比较基本的文件储存方法:
1..假设想用文本象数据库一样储存数据..为了以后的方便...一般是把每条数据储存为一行..以后用file函数把他分开..然后每行应该都有分割符...例如 | ..用来分割各个字段..把用file函数分开后的数据再用explode根据分割符进行分割...使他可以应用到程序中...就好象直接从数据库中取出某条记录的某字段一样...
2..看BO-BLOG学到的一点经验.....由于文件大了以后很难操作嘛..因此要尽量减上文件的大小...例如做新闻管理或BLOG的时候...每篇文章都应该单独生成一个文件储存....但假设是注册用户的信息呢??由于注册用户可能很多..我们不可能分开储存..那得多少个文件啊....这样我们可以先取得注册用户名的首字母..例如phzzy就是p...汉字用户名就是han_..这样分组储存在不同的文件中..在用户登陆判断密码时也不用一次打开一个庞大的文件..而是可以先取得首字母分析要打开那个文件然后在取得用户信息
3..要操作文件中的某一行..例如修改或删除什么的..一般是用file分割整个文件...听说也有人用指针做的..不过好象特别麻烦..那样好象必须确定文本中每行甚至每个"字段"(就是用|分割开来的东西)的字符数...比较麻烦...建议还是一次打开整个文件吧....打开整个文件并file后..生成一个数组..然后用循环找到要修改或删除的那一行并进行相关操作...然后在用implode合并数组并储存进文件中
4..木有了...想到再写

页: [1]
查看完整版本: PHP教程最基础介绍--文件的操作