php入门教程之文件操作基础

在有些场合中需要以文件的形式来对内容进行存储,通常这时候需要对文件进行一系列的操作,PHP中对于文件的操作跟其他计算机程序设计语言对文件的操作类似,对于文件的操作主要包括三个部分,以及围绕这三部分提供的辅助性函数来完成文件操作的工作.

(1)文件的创建与打开;

(2)文件的操作;

(3)文件的关闭;

在PHP中,通过一系列的函数来完成文件的操作,常用的函数及其简要说明罗列如下:

//文件打开,完成文件打开(在文件不存在时可创建文件),依赖于文件中模式的不同而具有不同的操作resource fopen ( string $filename ,string $mode [, bool $use_include_path = false [, resource $context ]] )

//$filename 打开或者要创建文件的路径及文件名,为了便于移植,使用反斜杠/为佳

//$mode 是文件打开的模式,有很多模式,比较常用的r,w,a,同样为了便于移植,建议mode中增加b(二进制)

//通常读文件为 rb ,写文件为 ab,分别表示以二进制读文件及以二进制向文件追加内容

//在文件打开操作过程中出现错误请首先检查文件所在的路径的权限设置

实例代码如下:

  1. //文件操作函数
  2. //写操作相关函数
  3. //把$string的内容写到文件指针$handle
  4. int fwrite ( resource $handle , string $string [, int $length ] )
  5. //函数是fwrite的别名函数
  6. fputs()
  7. //也能完成写操作,不同的是集成了fopen(),fwrite(),fclose(),使用该函数不用再打开关闭文件
  8. int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
  9. //读操作相关函数
  10. //逐行读取
  11. string fgets ( resource $handle [, int $length ] )
  12. //逐行读,能够过滤标记
  13. string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] )
  14. //逐行读,能够根据定界符输出到数组
  15. array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\' ]]]] )
  16. //一次性读取一个文件并将文件内容发送到标准输出,包含了文件打开与文件关闭操作
  17. int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
  18. //先要打开文件,然后将文件指针所指向的文件内容发送到标准输出
  19. int fpassthru ( resource $handle )
  20. //把结果发送到一个数组中
  21. array file ( string $filename [, int $flags = 0 [, resource $context ]] )
  22. //一次读取一个字符
  23. string fgetc ( resource $handle )
  24. //读取任意长度字节的内容
  25. string fread ( resource $handle , int $length )
  26. //文件关闭
  27. bool fclose ( resource $handle )
  28. //文件操作中常用的函数
  29. //检查文件或目录是否存在
  30. bool file_exists ( string $filename )
  31. //获取文件大小,返回文件大小的字节数
  32. int filesize ( string $filename )
  33. //删除文件
  34. bool unlink ( string $filename [, resource $context ] )
  35. //复位文件指针位置
  36. bool rewind ( resource $handle )
  37. //在文件指针中定位
  38. int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )

函数的具体详细的说明在php.net上可以查到,下面练习一下文件的操作,练习名称为『简易日记』,需求如下:

(1)每日记录的内容以年-月-日.txt保存在数据目录下;

(2)首页写日记,并显示以往的记录;

(3)显示单页记录内容;

首页(index.php)实例代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>简易日记--php文件操作练习</title>
  6. <style>
  7. h1 {
  8. font-size:24px;
  9. border-bottom:1px solid #000;
  10. line-height:40px;
  11. }
  12. .active {
  13. line-height:22px;
  14. font-size:14px;
  15. background:#2cf;
  16. padding:8px;
  17. text-decoration:none;
  18. }
  19. .btn {
  20. width:100px;
  21. height:40px;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <h1>我的日记本</h1>
  27. <p><span class="active">写日记</span></p>
  28. <form name="writediary" method="POST" action="diaryprocessed.php">
  29. <p>日记主题</p>
  30. <input type="text" name="diarytopic" size="60" maxlength="100" />
  31. <p>日记内容</p>
  32. <textarea name="diarycontents" rows="10" cols="53"></textarea>
  33. <p><input class="btn" type="submit" name="save" value="保存" /></p>
  34. </form>
  35. <hr>
  36. <p><span class="active">日记列表</span> </p>
  37. <hr>
  38. <?php
  39. $handler = opendir($_SERVER['DOCUMENT_ROOT'] . '/phpcodes/diarydatas/');
  40. while (($diaryname = readdir($handler)) !== false) {
  41. if($diaryname != "." && $diaryname != ".." ) {
  42. $files[] = $diaryname;
  43. }
  44. }
  45. closedir($handler);
  46. foreach($files as $value) {
  47. echo "<a href=viewdiary.php?>$value</a>" . " | ";
  48. }
  49. ?>
  50. </body>
  51. </html>
  52. 保存处理页(diaryprocessed.php)
  53. 代码如下 复制代码
  54. <?php
  55. header('Content-Type:text/html; charset=utf-8');
  56. $date = gmdate('Y-m-d', time() + 3600 * 8);
  57. $diarytopic = $_POST['diarytopic'];
  58. $diarycontents = $_POST['diarycontents'];
  59. $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
  60. $output = $diarytopic . "n" . $diarycontents . "n";
  61. $fp = fopen($DOCUMENT_ROOT . '/phpcodes/diarydatas/' . $date . '.txt', 'ab');
  62. flock($fp,LOCK_EX);
  63. if(!$fp) {
  64. echo "<p><strong>当前不能处理您提交的日志,请稍后再试!</strong></p>";
  65. echo "<a href="index.htm">返回</a>";
  66. }
  67. fwrite($fp,$output);
  68. flock($fp,LOCK_UN);
  69. fclose($fp);
  70. echo '日记提交成功!';
  71. echo "<a href="index.htm">返回</a>";
  72. 查看内容页(viewdiary.php)
  73. 代码如下 复制代码
  74. <?php
  75. $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
  76. ?>
  77. <!DOCTYPE html>
  78. <html>
  79. <head>
  80. <meta charset="utf-8">
  81. <title>简易日记</title>
  82. <style>
  83. * { line-height: 32px; }
  84. </style>
  85. </head>
  86. <body>
  87. <a href="index.php">写日记</a>
  88. <hr>
  89. <?php
  90. $diaryname = $_GET['id'];
  91. $filepath = $DOCUMENT_ROOT . '/phpcodes/diarydatas/' . $diaryname . '.txt';
  92. if (file_exists($filepath)) {
  93. $fp = fopen($filepath, 'rb');
  94. echo nl2br(fread($fp,filesize($filepath)));
  95. fclose($fp);
  96. }
  97. ?>
  98. </body>
  99. </html>