php 目录与文件处理-郑阿奇(续)

  1.文件目录操作

  最顶层止录是磁盘根目录,用'/'或'//'

  当前目录 ./

  ../表示apache的目录即htdocs目录

  1.创建与删除目录 mkdir

  

复制代码 代码如下:

  <?php

  if(mkdir("./path",0700)) //在当前目录中创建path目录

  echo "创建成功";

  ?>

  2.获取和更改当前目录

  使用getcwd()函数可以取得当前的工作目录,该函数没有参数。成功则返回当前的工作目录,失败则返回FALSE

  3.打开和关闭目录句柄

  opendir($dir)

  closed($dir_handle)

  4.读取目录内容

  readdir(),该参数是一个已经打开的目录句柄,与while循环可以实现对目录的遍历

  5.获取指定路径中的目录与文件 。

  array scandir(string $directory [, int $sorting_order [, resource $context ]])

  说明:$directory为指定路径。参数$sorting_order默认是按字母升序排列,如果设为1表示按字母的降序排列。

  $context是可选参数,是一个资源变量,可以用stream_context_create()函数生成,这个变量保存着与具体的操作对象有关的一些数据。

  函数运行成功则返回一个包含指定路径下的所有目录和文件名的数组,失败则返回FALSE

  2.操作文件的一般方法

  3.文件的打开与关闭

  1.打开文件

  resource fopen(string $filename , string $mode [, bool $use_include_path [, resource $context ]])

  ●$filename参数。fopen()函数将$filename参数指定的名字资源绑定到一个流上

  ●$mode参数。$mode参数指定了fopen()函数访问文件的模式,取值见表4.5。

  $mode

  说 明

  'r'

  只读方式打开文件,从文件头开始读

  'r+'

  读写方式打开文件,从文件头开始读写

  'w'

  写入方式打开文件,将文件指针指向文件头。如果文件已经存在则删除已有内容,如果文件不存在则尝试创建它

  'w+'

  读写方式打开文件,将文件指针指向文件头。如果文件已经存在则删除已有内容,如果文件不存在则尝试创建它

  'a'

  写入方式打开文件,将文件指针指向文件末尾,如果文件已有内容将从文件末尾开始写。如果文件不存在则尝试创建它

  'a+'

  读写方式打开文件,将文件指针指向文件末尾。如果文件已有内容将从文件末尾开始读写。如果文件不存在则尝试创建它

  'x'

  创建并以写入方式打开文件,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它。此选项被PH及以后的版本所支持,仅能用于本地文件

  'x+'

  创建并以读写方式打开文件,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它。此选项被PH及以后的版本所支持,仅能用于本地文件

  'b'

  二进制模式,用于连接在其他模式后面。如果文件系统能够区分二进制文件和文本文件(Windows区分,而UNIX不区分),则需要使用到这个选项,推荐一直使用这个选项以便获得最大程度的可移植性

  ●$use_include_path参数。如果需要在include_path(PHP的include路径,在PHP的配置文件设置)中搜寻文件,

  可以将可选参数 $use_include_path的值设为1或TRUE,默认为FALSE。

  ●$context参数。可选的$context参数只有文件被远程打开时(如通过HTTP打开)才使用,它是一个资源变量,

  其中保存着与fopen()函数具体的操作对象有关的一些数据。如果fopen()打开的是一个HTTP地址,

  那么这个变量记录着HTTP请求的请求类型、HTTP版本及其他头信息;如果打开的是FTP地址,

  记录的可能是FTP的被动/主动模式

  2.关闭文件

  bool fclose(resource $handle)

  4.文件的写入

  文件写入前需打开文件,不存在先创建它,一般用fopen()函数创建

  ●fwrite().文件打开后,向文件写入内容

  int fwrite(resource $handle , string $string [, int $length ])

  说明:参数$handle是写入的文件句柄,

  $string是将要写入文件中的字符串数据,

  $length是可选参数,如果指定了$length,则当写入了$string中的前$length个字节的数据后停止写入。

  ●file_put_contents()函数。PHP 5还引入了file_put_contents()函数。这个函数的功能与依次调用fopen()、fwrite()及fclose()函数的功能一样。语法格式如下:

  int file_put_contents(string $filename , string $data [, int $flags [, resource $context ]])

  说明:$filename是要写入数据的文件名。

  $data是要写入的字符串,$data也可以是数组,但不能为多维数组。

  在使用FTP或HTTP向远程文件写入数据时,可以使用可选参数$flags和$context,这里不具体介绍。

  写入成功后函数返回写入的字节数,否则返回FALSE。

  ●fputcsv()函数。CSV是一种比较常用的文件格式,一般以.csv作为扩展名。CSV格式把文件的一行看做是一条记录,记录里的字段使用逗号分隔。

  在PHP中使用 fputcsv()函数可以把指定的数组格式化为符合CSV文件格式的内容,并写入文件指针指向的当前行。语法格式如下:

  int fputcsv(resource $handle [, array $fields [, string $delimiter [, string $enclosure ]]])

  说明:参数$handle是要写入的文件句柄。

  参数$fields是要格式化的数组。

  可选的$delimiter参数用于设定字段分界符(只允许一个字符),默认为逗号。

  可选的$enclosure参数设定字段环绕符(只允许一个字符),默认为双引号

  5 文件的读取

  1.读取任意长度

  fread()函数可以用于读取文件的内容,语法格式如下:

  string fread(int $handle, int $length)

  说明:参数$handle是已经打开的文件指针,

  $length是指定读取的最大字节数,$length的最大取值为8192。

  如果读完$length个字节数之前遇到文件结尾标志(EOF),则返回所读取的字符,并停止读取操作。

  如果读取成功则返回所读取的字符串,如果出错返回FALSE。

  注意:在读取文件后显示文件内容时,文本中可能含有无法直接显示的字符,如HTML标记。

  这时需要使用htmlspecialchars()函数将HTML标记转化为实体才能显示文件中的字符。

  2.读取整个文件

  ●file()函数。file()函数用于将整个文件读取到一个数组中,语法格式如下:

  array file(string $filename [, int $use_include_path [, resource $context ]])

  说明:本函数的作用是将文件作为一个数组返回,数组中的每个单元都是文件中相应的一行,包括换行符在内,

  如果失败则返回FALSE。参数$filename是读取的文件名,参数$use_inclue_path和$context的意义与之前介绍的相同

  ●readfile()函数。readfile()函数用于输出一个文件的内容到浏览器中,语法格式如下:

  int readfile(string $filename [, bool $use_include_path [, resource $context ]])

  ●fpassthru()函数。fpassthru()函数可以将给定的文件指针从当前的位置读取到EOF,并把结果写到输出缓冲区。

  要使用这个函数,必须先使用fopen()函数打开文件,然后将文件指针作为参数传递给fpassthru()函数,

  fpassthru()函数把文件指针所指向的文件内容发送到标准输出。如果操作成功返回读取到的字节数,否则返回FALSE。

  ●file_get_contents()函数。file_get_contents()函数可以将整个或部分文件内容读取到一个字符串中,

  功能与依次调用fopen()、fread()及fclose()函数的功能一样。语法格式如下:

  string file_get_contents(string $filename [, int $offset [, int $maxlen ]])

  说明:$filename是要读取的文件名,可选参数$offset可以指定从文件头开始的偏移量,

  函数可以返回从$offset所指定的位置开始长度为$maxlen的内容。如果失败,函数将返回FALSE

  3. 读取一行数据

  ●fgets()函数。fgets()函数可以从文件中读出一行文本,语法格式如下:

  string fgets(int $handle [, int $length ])

  说明:$handle是已经打开的文件句柄,可选参数$length指定了返回的最大字节数,考虑到行结束符,

  最多可以返回length-1个字节的字符串。如果没有指定$length,默认为1024个字节

  ●fgetss()函数与fgets()基本相同,不过fgetss()函数会尝试从读取的文本中去掉任何html和php标记。

  ●fgetcsv()函数。fgetcsv()函数可以读取指定文件的当前行,使用CSV格式解析出字段,并返回一个包含这些字段的数组。

  语法格式如下:

  array fgetcsv(int $handle [, int $length [, string $delimiter [, string $enclosure ]]])

  4. 读取一个字符

  fgetc()函数。fgetc()函数可以从文件指针处读取一个字符,语法格式为:

  string fgetc(resource $handle)

  该函数返回$handle指针指向的文件中的一个字符,遇到EOF则返回FALSE

  5. 使用指定格式读取文件

  fscanf()函数。fscanf()函数可以读取文件中的数据,并根据指定的格式进行格式化,并返回一个数组。语法格式如下:

  mixed fscanf(resource $handle , string $format [, mixed &$... ])

  格式字符串中的任何空白会与输入流中的任何空白匹配。

  这意味着甚至格式字符串中的制表符“\t”也会与输入流中的一个空格字符匹配。

  6.文件的上传与下载

  1.文件上传

  文件上传可以通过提交html表单来实现。文件上传结束后,默认存储在临时目录中,这时必须从临时目录中删除或移动到其他地方

  使用PHP的move_uploaded_file()将其移到其它位置上

  move_uploaded_file()函数语法格式如下:

  bool move_uploaded_file(string $filename , string $destination)

  注意:在将文件移动之前需要检查文件是否是通过HTTP POST上传的,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,

  这时需要使用is_uploaded_file()函数。该函数的参数为文件的临时文件名,若文件是通过HTTP POST上传的,则函数返回TRUE。

  例4.5 将由HTML表单上传的GIF图片文件移动到html目录中

  

复制代码 代码如下:

  <form enctype="multipart/form-data" action="" method="post">

  <input type="file" name="myFile">

  <input type="submit" name="up" value="上传文件">

  </form>

  <!-- HTML表单 -->

  <?php

  if(isset($_POST['up']))

  {

  if($_FILES['myFile']['type']=="image/gif") //判断文件格式是否为GIF

  {

  if($_FILES['myFile']['error']>0) //判断上传是否出错

  echo "错误:".$_FILES['myFile']['error']; //输出错误信息

  else

  {

  $tmp_filename=$_FILES['myFile']['tmp_name']; //临时文件名

  $filename=$_FILES['myFile']['name']; //上传的文件名

  $dir="html/";

  if(is_uploaded_file($tmp_filename)) //判断是否通过HTTP POST上传

  {

  if(move_uploaded_file($tmp_filename,$dir.$filename)) //上传并移动文件

  {

  echo "文件上传成功!";

  //输出文件大小

  echo "文件大小为:". ($_FILES['myFile']['size']/1024)."kb";

  }

  else

  echo "上传文件失败!";

  }

  }

  }

  else

  {

  echo "文件格式非GIF图片!";

  }

  }

  ?>

  2.文件下载

  header()函数的作用是向浏览器发送正确的HTTP报头,报头指定了网页内容的类型、页面的属性等信息。

  header()函数的功能很多,这里只列出以下几点:

  ●页面跳转。如果header()函数的参数为“Location: xxx”,页面就会自动跳转到“xxx”指向的URL地址。例如:

  header("Location: http://www.baidu.com"); //跳转到百度页面

  header("Location: first.php"); //跳转到工作目录的first.php页面

  ●指定网页内容。例如,同样的一个XML格式的文件,如果header()函数的参数指定为“Content-type: application/xml”,

  浏览器会将其按照XML文件格式来解析。但如果是“Content-type: text/xml”,浏览器就会将其看做文本解析。

  header()函数结合readfile()函数可以下载将要浏览的文件

  7.其他常用文件函数

  1.计算文件大小

  filesize()函数用于计算文件的大小,以字节为单位

  filesize()函数结合fread()函数可以实现一次读取整个文件

  2.判断文件是否存在

  file_exits()

  is_dir()函数用于判断给定文件名是否是目录

  is_file()函数用于判断给定文件名是否是文件。

  is_readable()函数用于判断给定文件是否可读。

  is_writeable()用于判断给定的文件是否可写

  3.删除文件

  unlink()

  4.复制文件

  bool copy(string $source,string $dest),如果目示文件已存在,则将被覆盖

  5.移动、重命名文件

  除了move_uploaded_file()函数,还有一个rename()函数也可以移动文件。

  语法格式如下:

  bool rename ( string $oldname , string $newname [, resource $context ] )

  说明:rename()函数主要用于对一个文件进行重命名,$oldname是文件的旧名,$newname为新的文件名。

  当然,如果$oldname与$newname的路径不相同,就实现了移动该文件的功能

  6.文件指针操作

  PHP中有很多操作文件指针的函数,如rewind()、ftell()、fseek()函数等。之前用过的feof()函数用于测试文件指针是否处于文件尾部,

  也属于文件指针操作函数。

  rewind()函数。用于重置文件的指针位置,使指针返回到文件头。它的参数只有一个,就是已经打开的指定文件的文件句柄。

  ftell()函数。可以以字节为单位,报告文件中指针的位置,也就是文件流中的偏移量。它的参数也是已经打开的文件句柄。

  fseek()函数。可以用于移动文件指针,语法格式如下:

  int fseek ( resource $handle , int $offset [, int $whence ] )

  例4.8 投票统计

  

复制代码 代码如下:

  <form enctype="multipart/form-data" action="" method="post">

  <table border="0">

  <tr><td bgcolor="#CCCCCC">

  <font size=4 color=blue>当前最流行的Web开发语言:</font>

  </td></tr>

  <tr><td><input type="radio" name="vote" value="PHP">PHP</td></tr>

  <tr><td><input type="radio" name="vote" value="ASP">ASP</td></tr>

  <tr><td><input type="radio" name="vote" value="JSP">JSP</td></tr>

  <tr><td><input type="submit" name="sub" value="请投票"> </td></tr>

  </table>

  </form>

  <?php

  $votefile="EX4_6_vote.txt"; //用于计数的文本文件$votefile

  if(!file_exists($votefile)) //判断文件是否存在

  {

  $handle=fopen($votefile,"w+"); //不存在则创建该文件

  fwrite($handle,"0|0|0"); //将文件内容初始化

  fclose($handle);

  }

  if(isset($_POST['sub']))

  {

  if(isset($_POST['vote'])) //判断用户是否投票

  {

  $vote=$_POST['vote']; //接收投票值

  $handle=fopen($votefile,"r+");

  $votestr=fread($handle,filesize($votefile)); //读取文件内容到字符串$votestr

  fclose($handle);

  $votearray=explode("|", $votestr); //将$votestr根据“|”分割

  echo "<h3>投票完毕!</h3>";

  if($vote=='PHP')

  $votearray[0]++; //如果选择PHP,则数组第1个值加1

  echo "目前PHP的票数为:<font size=5 color=red>".$votearray[0]."</font><br>";

  if($vote=='ASP')

  $votearray[1]++; //如果选择ASP,则数组第2个值加1

  echo "目前ASP的票数为:<font size=5 color=red>".$votearray[1]."</font><br>";

  if($vote=='JSP')

  $votearray[2]++; //如果选择JSP,则数组第3个值加1

  echo "目前JSP的票数为:<font size=5 color=red>".$votearray[2]."</font><br>";

  //计算总票数

  $sum=$votearray[0]+$votearray[1]+$votearray[2];

  echo "总票数为:<font size=5 color=red>".$sum."</font><br>";

  $votestr2=implode("|",$votearray); //将投票后的新数组用“|”连接成字符串$votestr2

  $handle=fopen($votefile,"w+");

  fwrite($handle,$votestr2); //将新字符串写入文件$votefile

  fclose($handle);

  }

  else

  {

  echo "<script>alert('未选择投票选项!')</script>";

  }

  }

  ?>