Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

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

Posted on 2010-05-23 12:36  analyzer  阅读(508)  评论(0编辑  收藏  举报
操作文件是在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()两个函数
第一个是用来根据关键字分割字符串的,第二个刚好相反,是用关键字把字符串连成一个整体的
下面是手册上的两个小例子

  1. <?php
  2. $pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
  3. $pieces = explode(" ", $pizza);
  4. echo $pieces[0]; // piece1
  5. echo $pieces[1]; // piece2
  6. ?>
复制代码




  1. <?php
  2. $array = array('lastname', 'email', 'phone');
  3. $comma_separated = implode(",", $array);
  4. echo $comma_separated; // lastname,email,phone
  5. ?>
复制代码




实例:(一个简单的文件读写)

  1. <?php
  2. function writetofile($file_name,$data,$method="w") {
  3.         $filenum=fopen($file_name,$method);
  4.         flock($filenum,LOCK_EX);
  5.         $file_data=fwrite($filenum,$data);
  6.         fclose($filenum);
  7.         return $file_data;
  8. }

  9. function readfromfile($file_name) {
  10.         menu_idif (file_exists($file_name)) {
  11.         menu_idmenu_id$file_data=file_get_contents($file_name);
  12.         menu_idmenu_idreturn $file_data;
  13.         menu_id}
  14. }

  15. $filename="phzzy.txt";

  16. //下面数据后的\n为换行符,为了用file函数做准备,字符|为分割符,为explode函数做准备
  17. $filedata_1="phzzy|http://www.flashforweb.com|copyright2005!\n";
  18. $filedata_2="a-fei|http://www.flashforweb.com/a-fei|copyright 2004-2005\n";
  19. $filedata_3="xxxx|http://www.somesite.com|no copyright!\n";
  20. $filedata_4="yyyy|http://www.nosite.com|No copyright!\n";

  21. writetofile($filename,$filedata_1);//把$filedata_1写入$filename中,如果$filename不存在它会自动生成这个文件,如果存在则将文件里的内容全部删除然后在写入$filedata_1
  22. //此时phzzy.txt文件中会出现,并且里面的数据为$filedata_1

  23. $content_1=readfromfile($filename);
  24. echo $content_1;
  25. echo "<hr>";

  26. //下面是向文件末尾插入一行记录
  27. $temp=readfromfile($filename);//先读取全部记录
  28. writetofile($filename,$filedata_2 . $temp);//写入记录

  29. $content_2=readfromfile($filename);
  30. echo $content_2;
  31. echo "<hr>";

  32. //下面是向文件最开始插入一条记录
  33. $temp=readfromfile($filename);//先读取全部记录
  34. writetofile($filename,$temp . $filedata_3);//写入记录

  35. $content_3=readfromfile($filename);
  36. echo $content_3;
  37. echo "<hr>";

  38. //下面是向文件第三行插入一条记录
  39. $all=file($filename);
  40. $allcount=count($all);
  41. for($i=0;$i<$allcount;$i++){
  42.         menu_id$wdata.=$all[$i];
  43.         menu_idif($i==1) $wdata.=$filedata_4;
  44. }
  45. writetofile($filename,$wdata);

  46. $content_4=readfromfile($filename);
  47. echo $content_4;
  48. echo "<hr>";


  49. //最后介绍explode和implode的用法

  50. //先用explode按格式循环输出所有数据,现在文本中总共有4条数据
  51. $all=file($filename);
  52. $allcount=count($all);
  53. for($i=0;$i<$allcount;$i++){
  54.         menu_id$show_array=@explode("|", $all[$i]);//用|做为分割符号,然后分别用数组$show_array储存,每次分割的是第$i行的数据
  55.         menu_idecho "Name: ".$show_array[0]."<br>";
  56.         menu_idecho "Website: "."<a href=".$show_array[1].">".$show_array[1]."</a><br>";
  57.         menu_idecho "Copyright: ".$show_array[2]."<br><br><br>";
  58. }

  59. //implode和explode的用法刚好相反,一般是接收到用户传过来的分散的值把它组合成一个整体的值,然后在文本中存成一行,具体大家自己弄弄拉,可以看implode那个小例子

  60. ?>
复制代码



补充::
一些比较基本的文件储存方法:
1..如果想用文本象数据库一样储存数据..为了以后的方便...一般是把每条数据储存为一行..以后用file函数把他分开..然后每行应该都有分割符...比如 | ..用来分割各个字段..把用file函数分开后的数据再用explode根据分割符进行分割...使他可以应用到程序中...就好象直接从数据库中取出某条记录的某字段一样...

2..看BO-BLOG学到的一点经验.....因为文件大了以后很难操作嘛..所以要尽量减上文件的大小...比如做新闻管理或BLOG的时候...每篇文章都应该单独生成一个文件储存....但如果是注册用户的信息呢??因为注册用户可能很多..我们不可能分开储存..那得多少个文件啊....这样我们可以先取得注册用户名的首字母..比如phzzy就是p...汉字用户名就是han_..这样分组储存在不同的文件中..在用户登陆判断密码时也不用一次打开一个庞大的文件..而是可以先取得首字母分析要打开那个文件然后在取得用户信息

3..要操作文件中的某一行..比如修改或删除什么的..一般是用file分割整个文件...听说也有人用指针做的..不过好象特别麻烦..那样好象必须确定文本中每行甚至每个"字段"(就是用|分割开来的东西)的字符数...比较麻烦...建议还是一次打开整个文件吧....打开整个文件并file后..生成一个数组..然后用循环找到要修改或删除的那一行并进行相关操作...然后在用implode合并数组并储存进文件中

4..木有了...想到再写


http://www.flashforweb.com 作者:Phzzy
我要啦免费统计