PHP文件处理

文件系统的概述

任何类型的变量在程序运行的时候都会被加载到内存中去。但是内存有一个特点,不能持久的保存数据,一旦断电,内存中的数据就没有。

如果要持久保存数据,方法有两种:第一种是保存在文件里面,第二种方法是存储到数据库里面。

关于文件的操作大致有:创建,编辑,删除,复制,粘贴,文件上传和下载。

PHP里面对文件的操作基于UNIX操作系统的。所以在PHP中很多函数都类似于UNIX系统下面的命令。在Windows里面并没有提供UNIX系统的特性,但是大部分PHP文件操作函数还是支持的,有一小部分不支持。

 

文件类型

PHP是以UNIX的文件系统为模型,在UNIX系统里面,文件的类型可以分为7种:可能的值有 fifochardirblocklinkfile unknown

如下表:

文件类型

描述

fifo

命名管道,常用于将信息从一个进程传递到另外一个进程

char

字符设备

dir

目录类型

block

块设备文件,例如磁盘分区,光驱等

link

符号链接

file

普通的文件类型

unknown

未知类型

 

Windows系统里面,只有3种文件类型:dirfileunknown

PHP里面可以通过filetype()函数来获取文件类型

 

该文件位于D盘下面

 

结果:

 

 

示例2

 

该文件位于D盘下面:

 

结果:

 

 

file_exists():判断一个文件是否存在

 

 

还有一组判断一个文件是否为某一个文件类型的函数,例如:is_dir()is_file()

 

 

文件的属性

PHP里面,也是可以获取到文件的属性的。例如:文件的大小,文件的创建时间,文件的修改时间。通过一组PHP函数都是可以获取到这些属性的

如下表:下面的函数接收的参数均为文件路径

函数

功能

返回值

file_exists()

检测一个文件是否存在

返回true或者false

filesize()

获取文件的大小

返回文件大小的字节数

filectime()

获取文件创建的时间

返回一个时间戳

filemtime()

获取文件修改的时间

返回一个时间戳

fileatime()

获取文件上一次访问的时间

返回一个时间戳

is_readable()

判断文件是否可读

返回true或者false

is_writeable()

判断文件是否可写

返回true或者false

is_executable()

判断文件是否可执行

返回true或者false

is_file()

判断是否为一个文件

返回true或者false

is_dir()

判断是否为目录

返回true或者false

stat

获取文件的大部分信息

返回一个关于文件信息的数组

 

接下来,我们把上面的函数挨着走一遍:

 

文件位于D盘下面:

 

结果:

 

 

 

Stat():返回的是一个数组,数组里面装的是大部分文件信息

 

示例:

 

效果:可以看到,返回的数组的数据分为两组,索引一组,关联一组

 

Windows系统的没有uidgidblksizeblocks等属性,在Windows系统下默认值为0或者-1

 

目录的基本操作

目录的路径

目录的路径分为两种:绝对路径和相对路径

绝对路径:所谓绝对路径,就是从根目录一级一级的往下找,最后找到指定的文件名或者目录。

相对路径:从当前的目录进入某一个目录,最后找到要找的文件名或者目录名

绝对路径和相对路径示例:

 

UNIX系统里面,路径分隔符就是使用的/,但是在Windows里面,路径分隔符为\

 

虽然windows下面的路径分隔符为\,但是也支持/,但是为了代码更好的移植性,一般就使用/作为路径分隔符

 

这里再介绍一个PHP里面的内置常量DIRECTORY_SEPARATOR,该常量就是用来表示路径分隔符的。

 

 

通常我们在编写程序的时候,将路径的各个部分取出来是很有必要的。这里介绍几个常用的basename()dirname()pathinfo()

 

basename():返回路径的文件名部分。可以接受两个参数,第一个参数为路径,第二个参数为文件类型,如果传入,则不显示文件的扩展名

 

 

dirname():获取路径的目录部分

 

 

pathinfo():会返回一个关联数组,该数组里面就包含目录名,完整的文件名,文件后缀和去掉后缀名的文件名

 

 

遍历目录

所谓遍历目录,就是指将目录下面的所有的文件输出一次

遍历目录需要用到如下的函数:

opendir():打开指定目录,会返回一个资源类型的数据

readdir():读取指定的目录,读取一次目录指针就会向后移动一次,当移动到末尾的时候,返回false

closedir():关闭指定目录

rewinddir():倒回目录指针,就是将目录指针移动到目录开始处

 

遍历目录示例:

 

对应的文件路径:

 

结果:

 

 

...在每一个目录里面都默认存在,其中.表示当前目录,..代表上一级目录

 

这里还存在一个问题:如果目录是中文,那么遍历的时候会出现乱码,为什么?原因很简单,PHP的编码为UTF-8,但是Windows中文版所使用的编码为GB2312,这个时候,我们就需要进行相应的转码

PHP里面,提供了一个iconv()函数,可以进行转码。

iconv(“原来的编码”,”要转换成什么编码”,要进行转换的内容)

示例:

 

效果:

 

 

glob()函数:同样可以用来检索指定的目录,返回一个包含检索结果的数组

 

 

统计目录大小

PHP系统里面,为我们提供了两个函数disk_free_space()disk_total_space()

disk_free_space():统计磁盘空余的空间

disk_total_space():统计磁盘总共的空间

示例:默认返回的值以字节为单位

 

 

因为上面两个函数返回的是字节数,所以我们需要自己书写函数来将字节数转换为相应的单位:

 

 

统计目录的大小

PHP并没有给我们提供统计目录大小的函数,所以只有我们自己来书写统计目录大小的函数

这里我们定义一个dirSize的函数,该函数需要传入一个路径参数

 

以后如果要计算目录大小,直接调用该函数即可

 

 

创建和删除目录

创建目录非常简单,PHP系统提供了mkdir()函数来创建目录,接收一个参数,目录的路径

 

效果:

 

 

删除目录使用的函数为rmdir().接收一个参数,就是要删除目录的路径

 

 

如果目录为一个非空目录,则rmdir()函数无法将其进行删除

 

 

通过系统提供unlink()函数可以删除文件

 

 

如果要删除一个非空的目录,需要我们自己书写函数

 

 

复制目录

PHP里面提供给我们了一个函数copy函数,该函数接收两个参数

Copy(源文件的路径,复制文件的路径)

 

效果:

 

 

但是在PHP系统中,并没有给我们提供复制目录的函数,所以,我们得自己写。

详细参见copyDir.php文件

 

移动目录

PHP里面有一个rename()的系统函数,可以对目录和文件进行移动,移动的同时还可以对文件进行重命名

 

 

 

文件的相关操作

文件的打开和关闭

文件的打开使用fopen()函数,接收两个参数fopen(文件的路径,打开的方式)

打开方式如下图:

 

示例:

 

 

 

文件的关闭

系统提供了fclose()函数来关闭打开的文件,需要传入一个参数,打开的资源

 

 

文件写入

PHP提供了一个fwrite()函数来将字符串写入到文件中。需要注意一个换行的问题。针对不同的操作系统,换行的字符有所不同。Windows系统换行使用的\r\n  UNIX系统使用的是\n 苹果机系统的换行符为\r

fwrite(文件资源,写入的字符串,[写入长度])

 

 

第三个参数可以指定写入的长度

 

 

该函数有一个别名函数fputs()函数,功能上和fwrite()函数的功能一模一样

 

 

Windows系统下面使用\r\n来进行换行,示例如下:

 

 

PHP中还提供了一个file_put_contents()函数,也是用于快速写入,因为使用该函数就相当于依次调用fopen()fwrite()fclose()

 

 

 

读取文件

PHP里面提供了一套读取文件的函数,如下表:

函数

描述

fread()

读取打开的文件

file_get_contents()

打开文件,读取文件,关闭文件

fgets()

从打开的文件中返回一行

fgetc()

从打开的文件中返回一个字符

file()

把文件读取到一个数组里面

readfile()

读取一个文件,直接输出到输出缓冲区

 

在读取文件的时候,如何判断文件是否到达末尾,根据标准,一般被称之为EOF(End Of File),在PHP里面,也给我们提供了一个函数,feof()用来判断一个文件指针是否到达文件的结束处,如果在结尾处,返回true,否则返回false

 

① fread():在打开的文件中读取指定的长度

 

 

课堂练习:读取文件所有的内容

方法一:

 

方法二:

 

 

②  file_get_contents():相当于依次调用fopen()fread()fclose

 

③ fgets():从文件里面读取一行

 

对应文件内容:

 

这里需要注意:一行的判断标准为是否有换行。

 

④ fgetc():从打开的文件中获取一个字符,这个用得很少,了解即可

 

⑤  file():和file_get_contents()函数类似,不需要使用fopen()函数来打开文件,是文件一次性读取为一个数组

 

数组的长度取决于文件的行数

⑥ readfile():读取一个指定的文件,直接输出到输出的缓冲区里面。换句话说,就是一调用该函数,就立即输出,该函数也是不需要打开和关闭的。

 

 

访问远程文件

访问远程文件的方法和访问本地的方法是一模一样的

 

 

文件上传与下载

上传文件在做开发的时候也是很常见的需求。关于文件上传一般分为两个部分:1. 客户端上传设置  2. 在服务器端通过PHP处理上传的文件

(1) 客户端上传设置

文件上传最基本的方法就是通过表单中的file控件来进行文件上传。

代码如下:

 

 

 

(2) 在服务器端通过PHP对上传文件进行处理

服务器端PHP处理上传文件主要需要了解3个方面的知识

①  关于PHP配置文件中的指令

指令名

默认值

描述

file_uploads

On

确定服务器上的PHP脚本是否可以接受HTTP文件上传

upload_max_filesize

2MB

限制PHP处理上传文件大小的最大值,这个值不能超过post_max_size

post_max_size

8MB

限制通过post方法可以接收信息的最大值

upload_tmp_dir

NULL

上传文件的临时路径

max_file_uploads

20

最大允许上传的文件个数

 

file_uploads:确定服务器上的PHP脚本是否可以接受HTTP文件上传

 

 

upload_max_filesize:限制PHP处理上传文件大小的最大值,这个值不能超过post_max_size

 

 

post_max_size:限制通过post方法可以接收信息的最大值

 

 

upload_tmp_dir:上传文件的临时路径

 

 

max_file_uploads:最大允许上传的文件数

 

②  $_FILES多维数组

通过post方法上传的文件的相关信息就存储在这个超全局数组里面。该数组是一个二维数组。

数组

描述

$_FILES[“myFile”][“name”]

上传文件的名字,包含扩展名

$_FILES[“myFile”][“size”]

上传文件的大小,单位为字节

$_FILES[“myFile”][“tmp_name”]

文件上传后的临时文件名

$_FILES[“myFile”][“error”]

文件上传时的错误信息,有5个可能的值

0:表示没有任何错误,文件上传成功

1:表示上传的文件超出了在PHP配置文件中的upload_max_filesize的值

2:表示上传的文件超出了HTML表单里面的MAX_FILE_SIZE的值

3:表示文件只有部分被上传

4:没有上传任何文件

$_FILES[“myFile”][“type”]

获取上传文件的MIME类型,/前面代表主类型,后面代表子类型

text/html

image/png

image/jpg

image/gif

 

 

③ PHP中为文件上传提供的两个函数

is_uploaded_file():判断文件是否是通过POST方法来上传的,如果是,则返回true,该函数需要传入一个参数:$_FILES[“myFile”][“tmp_name”],如果是POST方法上传而来的,返回true,否则返回false

move_uploaded_file(上传文件名,指定位置):将上传的文件移动到指定文件夹

 

 

 

文件上传具体代码:参见【上传文件Demo

 

 

处理多个文件上传

多个文件上传的方法和单独上传一个文件的方法是一样,只不过,在客户端要做一些改变

 

 

在服务器端的$_FILES也由二维数组变为三维数组

 

文件的下载

最简单的就是通过a标签。当a标签链接的是一个不能被浏览器渲染的文件时,浏览器就会选择将其下载下来。

 

因为1.zip文件浏览器不能将其渲染出来,所以浏览器选择将其下载下来,这就是下载的最基本原理。

 

如果想要下载浏览器能够渲染出来的文件,这个时候,必须要使用header():该函数用来向浏览器发送头部信息,也就是说,通过该函数来告诉浏览器发送过来的是一个什么样的文件

下面的PHP文件一旦运行,就会下载相应路径的文件

 

接下来只要放入a标签里面即可

 

 

 

额外的:

 

ini_get()获取配置的属性值

posted @ 2017-08-21 12:18  苦中作乐。  阅读(142)  评论(0)    收藏  举报