文章教程

8.2文件处理

9/17/2020 9:49:37 PM 人评论 次浏览

8.2 文件处理

在任何计算机设备中,文件都是必需的对象。在Web编程中,文件的操作也一直是让Web程序员头疼的,而文件的操作在一些特定的Web系统中也是必需的。PHP提供了丰富的文件和目录读写功能以及文件上传功能,可以快速便捷地满足应用的需要。

8.2.1 文件的打开与关闭

有关文件的操作,最基本的就是读写文件。下面就分别介绍对文件的打开与关闭操作。

1.文件的打开

PHP提供fopen()函数用来打开本地或远程文件,打开文件的方式有只读方式、写入方式和读写方式等。函数语法:

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

(1)参数$filename就是要打开的文件的文件名。

(2)参数$mode为打开模式,可选参数有r、r+、w、w+、a、a+、x、x+等8个,分别代表只读、写入等不同的打开方式。具体打开模式参见表8-2。

表8-2 文件打开模式参数

打开模式 描述
r 以只读方式打开,将文件指针指向文件头
r+ 以读写方式打开,将文件指针指向文件头
w 以写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建它
w+ 以读写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建它
x 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它
x+ 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它

(3)参数use_ include_ path,可选。如果也需要在use_include_ path中检索文件,可以将该参数设为1或true。

(4)参数zcontext,可选。规定文件句柄的环境。zcontext是可以修改流的行为的一套选项。

以下语句通过fopen()函数以只读方式打开文件test.txt。

  $file = fopen("test.txt","r");

2.文件的关闭

打开一个文件,完成读写操作后,需记得及时关闭这个文件。PHP提供关闭文件功能的函数是fclose()。函数语法:

  bool fclose(resource $handle)

(1)参数file是一个文件指针。fclose()函数关闭该指针指向的文件。

(2)如果函数执行成功则返回true,否则返回false。文件指针必须有效,并且是通过fopen()或fsockopen()成功打开的。

8.2.2 文件的访问

1.读取文件

最常用的读取文件内容函数是fread(),函数语法为:

  fread(file,length)

(1)参数file必需。规定要读取打开的文件。

(2)参数length必需。规定要读取的最大字节数。

(3)返回所读取的字符串,如果出错返回false。

8-20.php完成以只读方式打开文件test.txt,并输出该文件内容,最后关闭该文件。

8-20.php

  <?php
  		$file = fopen("test.txt","r");
  		echo fread($file,filesize("test.txt"));
  		fclose($file);
  ?>

运行效果如图8-20所示。

image

图8-20 8-20.php运行效果

2.写入文件

最常用的写入文件的函数是fwrite (),函数语法:

  fwrite(file,string,length)

(1)参数file必需。规定要写入的打开文件。

(2)参数string必需。规定要写入文件的字符串。

(3)参数length可选。规定要写入的最大字节数。

(4)fwrite()把string的内容写入文件指针file处。如果指定了length,当写入了length个字节或者写完了string以后,写入就会停止,看先碰到哪种情况。

(5)fwrite()返回写入的字符数,出现错误时则返回false。

下面的例子完成以写入方式打开文件test.txt,并将“Hello World. Testing!”写入该文件,输出写入文件字符数,最后关闭该文件。

8-21.php

  <?php
  		
  			$file = fopen("test.txt","w");
  			echo fwrite($file,"Hello World. Testing!");
  			fclose($file);
  	?>

运行效果如图8-21所示。

image

图8-21 8-21.php运行效果

8.2.3 目录的处理

目录操作在程序开发中也是必需的,PHP提供了目录操作的相关函数。以下介绍目录相关操作的函数。

1.判断指定目录是否存在

PHP通过is_dir()函数判断指定目录是否存在。函数用法如下。

  is_dir(file)

(1)参数file必需。规定要检查的文件。

(2)如果文件名存在并且为目录,则返回true。如果file是一个相对路径,则按照当前工作目录检查其相对路径。

示例8-22.php完成判断book是否是一个目录,如果是一个目录则输出“book is a directory”,否则输出“dir is not a directory”。

8-22.php

  <?php
  		$dir = "book";
  		if(is_dir($dir))
   		 {
   			 echo "$dir is a directory";
   		 }
  		else
   		 {
   			 echo "$dir is not a directory";
   		 }
  ?>

运行效果如图8-22所示。

image

图8-22 8-22.php运行效果

2.创建目录

在程序编写时有时需要创建目录,PHP提供了mkdir()函数,函数用法如下。

  mkdir(path,mode,recursive,context)

(1)path必需。规定要创建的目录的名称。

(2)mode必需。规定权限。默认是0777。

(3)recursive必需。规定是否设置递归模式。

(4)context必需。规定文件句柄的环境。context是可修改流的行为的一套选项。

(5)mkdir()尝试新建一个由path指定的目录。默认的mode是0777,意味着最大可能的访问权。

8-23.php完成创建目录testing。

8-23.php

  	<?php
  		echo "mkdir('testing')运行返回:";
  		var_dump(mkdir("testing"));
  	?>

运行效果如图8-23所示。

image

图8-23 8-23.php运行效果

3.删除目录

PHP提供函数rmdir()完成目录删除操作,函数语法如下。

  rmdir(dir,context)

(1)dir必需。规定要删除的目录。

(2)context规定文件句柄的环境。context是可修改流的行为的一套选项。

(3)函数若执行成功,则该函数返回true。若失败,则返回false。尝试删除dir所指定的目录。该目录必须是空的,而且要有相应的权限。

8-24.php

  <?php
  		$path = "testing";
  		if(!rmdir($path))
   		{
    			echo ("Could not remove $path");
    		}
  		else
  		{
    			echo (" remove $path");
    		}

运行效果如图8-24所示。

image

图8-24 8-24.php运行效果

4.显示指定目录信息

PHP使用pathinfo()函数返回文件路径的信息。pathinfo()函数用法如下。

  pathinfo(path,Process_sections)

(1)path必需。规定要检查的路径。

(2)Process_sections可选。规定要返回的数组元素。默认是all。process_sections可取下列值。

① PATHINFO_DIRNAME:只返回dirname。

② PATHINFO_BASENAME:只返回basename。

③ PATHINFO_EXTENSION:只返回extension。

(3)pathinfo()函数以数组的形式返回文件路径的信息。

8-25.php可以返回文件test.txt所在目录的信息。

8-25.php

  <?php
  		print_r(pathinfo("test.txt"));
  	?>

运行效果如图8-25所示。

image

图8-25 8-25.php运行效果

8.2.4 文件上传与下载

在编写程序时,有时还需完成文件的上传及下载功能。下面来学习如何实现文件的上传与下载。

1.文件上传

要想上传本地文件到服务器,必须使用表单的POST方法,GET方法是不能实现此功能的,同时,表单的enctype属性必须设置为“multipart/form-data”。下面来看一个文件上传的例子。

8-26.php

  <html>
  <body>
  <form action="upload_file.php" method="post" enctype="multipart/ form-
  data">
  	<label for="file">Filename:</label>
  	<input type="file" name="file" id="file" />
  	<br />
  	<input type="submit" name="submit" value="Submit" />
  </form>

  </body>
  </html>

upload_file.php代码如下。

  <?php
  		if ($_FILES["file"]["error"] > 0)
   		 {
    			echo "Error: " . $_FILES["file"]["error"] . "<br />";
   		 }
  		else
    		{
    				echo "Upload: " . $_FILES["file"]["name"] . "<br />";
   				echo "Type: " . $_FILES["file"]["type"] . "<br />";
   				echo "Size: ".($_FILES["file"]["size"] / 1024) . " Kb<br />";
   				 echo "Stored in: " . $_FILES["file"]["tmp_name"];
    		}

运行效果如图8-26~图8-28所示。

image

图8-26 选择上传文件前

image

图8-27 选择上传文件后

image

图8-28 上传文件后的信息

2.文件下载

文件下载有两种方法,第一种非常简单,通过超链接实现,比如:

  <a href="a.rar">下载a.rar</a>

该方法只能下载浏览器不能解析的文件,比如rar或脚本文件之类。如果文件是图片或者txt文档,就会直接在浏览器中打开。

第二种方式是代码。

8.27.php

  <html>
  <body>

  <form action="download.php" method="post" enctype="multipart/form-data">
  	
  	<input type="submit" name="submit" value="dowmload" />
  </form>

download.php代码如下:

  </body>
  </html>

  	<?php
  		$file=fopen('test.txt',"r");
  		header("Content-Type: application/octet-stream");
  		header("Accept-Ranges: bytes");
  		header("Accept-Length: ".filesize('test.txt'));
  		header("Content-Disposition: attachment; filename='test.txt'");
  		echo fread($file,filesize('test.txt'));
  		fclose($file);
  ?>

运行结果如图8-29所示。

image

图8-29 下载文件

单击download按钮后弹出下载文件窗口,选择保存下载文件目录后,单击“下载”按钮,如图8-30所示。

image

图8-30 下载文件

教程类别