PHP-文件系统
学习文件处理本质上面就是学习文件处理的函数。 ヾ(๑╹◡╹)ノ”
 
 
 
 
一. 读取文件
 
1.1 readfile读取文件
读取一个文件内容的函数:int readfile ( string $文件名)
功能:传入一个文件路径,输出这个文件里面的内容。
1 | <?php |
注意:上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。
 
 
1.2 file_get_contents打开文件
上面的是单纯打文件就直接输出了,有没有打开文件后,能够赋值给一个变量的操作方式呢。
string file_get_contents ( string filename)
功能:传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。
1 | <?php |
上面的代码,就打开了一个文件,并且将文件当中的内容进行了输出。
 
我们来针对之前的知识把代码进行一下扩展。用一用之前的知识点。
1 |
|
 
上述的explode()、list()两个字符串函数和each()数组函数。
1. explode()函数:把字符串打散为数组。[PHP explode() 函数] [PHP String 函数]
语法:explode(separator,string,limit)
参数 | 描述 |
---|---|
separator | 必需。规定在哪里分割字符串。 |
string | 必需。要分割的字符串。 |
limit | 可选。规定所返回的数组元素的数目。 可能的值: 大于 0 - 返回包含最多 limit 个元素的数组 小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组 0 - 返回包含一个元素的数组 |
 
2. list()函数:把数组中的值赋给一些变量,在一次操作中给一组变量赋值。[PHP list() 函数]
1 |
|
 
3. each()函数:返回当前元素的键名和键值。该元素的键名和键值返回到带有四个元素的数组中。
两个元素(1 和 Value)包含键值,两个元素(0 和 Key)包含键名。[PHP each() 函数]
1 |
|
 
 
1.3 fopen、fread、fclose操作读取文件
上面file_get_contents打开文件的方式简单、粗暴。下面的
resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )
通过上面的函数我们来讲解资源类型的通常操作方式:
1.打开资源
2.使用相关函数进行操作
3.关闭资源
 
1. fopen函数:打开文件,返回一个资源
参数主要有两个:1.文件打开的路径,2.打开文件的模式
例:$fp=fopen(‘NoAlike.txt’, “r”);
返回类型是一个资源类型。
资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。
2. fread函数:读取打开的文件资源。
也包含两个参数,读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。
例:$contents = fread($fp, 1024);
 
3. fclose函数:fclose函数的功能是关闭资源。资源有打开就有关闭。
包含一个参数,这个参数就是fopen()返回的资源。
例:fclose($fp);
 
fopen的模式有下面几个(。・∀・)ノ
模式 | 说明 |
---|---|
r | 只读方式打开,将文件指针指向文件头。 |
r+ | 读写方式打开,将文件指针指向文件头。 |
w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
x+ | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
 
r模式示例:
1.打开文件:fopen()
1 |
|
 
2.读取文件:fread()
1 |
|
 
3.关闭文件:fclose()
1 |
|
 
其他注意事项:
模式 | 说明 |
---|---|
t | windows下将\n转为\r\n |
b | 二进制打开模式 |
说明:
Windows 下提供了一个文本转换标记(’t’)可以透明地将 \n 转换为 \r\n。
与此对应还可以使用 ‘b’ 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 ‘b’ 或者用 ‘t’ 作为 mode 参数的最后一个字符。
 
 
二. 创建和修改文件内容
2.1 file_put_contents写入文件
int file_put_contents ( string $文件路径, string $写入数据])
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
1 |
|
 
2.2 fwrite配合fopen进行写入操作、fopen()打开模式的比较
int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
注:fwrite的别名函数是fputs
1. fopen()的w模式:写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。每一次写入新的数据时,都会将原来的数据清空之后才写入!
1 |
|
总结:
1. 不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建
那我们来对比一下以下几个模式的不同:
模式 | 说明 |
---|---|
r | 只能读不能使用fwrite写 |
r+ | 可操作读、写(可使用fwrite写入) |
w | 只可以写功能 |
w+ | 即可读又可以写 |
 
2.3 a模式和w模式、x模式和w模式的不同
1. a模式和w模式总结:
模式 | 总结 |
---|---|
x | 每次写入会干掉原有文件的内容,文件不存在都会创建 |
a | 每次写入都会向文件的尾端追加内容 |
 
2. x模式和w模式总结:
1 |
|
总结:
1.文件存在的时候会报错
2.如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了
3.x+ 是增强的x模式。读取时也可以使用。
 
 
三. 创建临时文件
使用这个函数:resource tmpfile ( )
功能:创建一个临时文件,返回资源类型。关闭文件即被删除。
1 | <?php |
 
 
四. 移动、拷贝和删除文件
4.1 重命名文件
bool rename(oldname,newname,context);
参数 | 描述 |
---|---|
oldname | 必需。规定要重命名的文件或**目录(文件夹)**。 |
newname | 必需。规定文件或目录的新名称。 |
context | 可选。规定文件句柄的环境。context 是可修改流的行为的一套选项。 |
1 |
|
 
4.2 复制文件
bool copy(源文件,目标文件);
功能:将指定路径的源文件,复制一份到目标文件的位置。如果复制到当前目录下,则必须重新改一个名字,其他目录下的话也要在目的路径下加上文件名,不管改不改名字。
copy(source,destination):
参数 | 描述 |
---|---|
source | 必需。规定要复制的文件。 |
destination | 必需。规定复制文件的目的地。 |
(1)创建文件并复制到当前文件夹下面↓↓
1 |
|
(2)创建文件并复制到其他文件夹下面↓↓
1 |
|
 
4.3 删除文件
bool unlink(指定路径的文件);
1 |
|
 
 
五. 检测文件属性函数
函数 | 功能 |
---|---|
bool file_exists ( $指定文件名或者文件路径) | 文件是否存在 |
bool is_readable ( $指定文件名或者文件路径) | 文件是否可读 |
bool is_writeable ( $指定文件名或者文件路径) | 文件是否可写 |
bool is_executable ( $指定文件名或者文件路径) | 文件是否可执行 |
bool is_file ( $指定文件名或者文件路径) | 是否是文件 |
bool is_dir ( $指定文件名或者文件路径) | 是否是目录 |
void clearstatcache ( void ) | 清楚文件的状态缓存 |
 
1 |
|
 
 
六. 文件常用函数和常量
6.1 目录分割符常量
平台 | 分割符 |
---|---|
windows | \ 或者 / |
类unix | / |
- windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxx
- linux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的
- 所以当开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。
 
6.2 DIRECTORY_SEPARATOR常量
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符,在linux上路径的分隔符是/,这就导致了一个问题,比如开发机器是windows,有一个图片上传程序,,而我们又使用了(\)作为文件分隔符,调试机器上指定的上传文件保存目录是:
define(‘ROOT’,dirname(_FILE_).”\upload”),在本地调试都很正常,但是上传到linux服务器的时候会发现会出错。
这个问题就是出在文件的分隔符上,windows上习惯性的使用\作为文件分隔符,但是在linux上人家是不认识这个标识的,人家只认识/,于是就要引入下面这个php内置变量了:DIRECTORY_SEPARATOR。
上面的写法可以改写为以下无错写法:
define(‘ROOT’,dirname(_FILE_).DIRECTORY_SEPARATOR.”upload”);
这样就可以确保不会出错了。
总结:
DIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到。
 
6.3 文件指针操作函数
rewind ( resource handle)
功能:指针回到开始处
fseek ( resource handle, int offset [, int from_where])
功能:文件指针向后移动指定字符
注意:我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。
参数 | 描述 |
---|---|
file | 必需。规定要在其中定位的文件。 |
offset | 必需。规定新的位置(从文件头开始以字节数度量)。 |
whence | 可选。 可能的值: SEEK_SET - 设定位置等于 offset 字节。默认。 SEEK_CUR - 设定位置为当前位置加上 offset。 SEEK_END - 设定位置为文件末尾加上 offset (要移动到文件尾之前的位置,offset 必须是一个 负值)。 |
 
6.4 filesize 检测文件的大小
1 |
|
 
还有一些其他操作文件的函数,读取文件:
函数名 | 功能 |
---|---|
file | 把整个文件读入一个数组中 |
fgets | 从文件指针中读取一行,读到最后返回false |
fgetc | 从文件指针中读取一个字符,读到最后返回false |
ftruncate | 将文件截断到给定的长度 |
 
6.5 文件的时间函数
函数名 | 功能 |
---|---|
filectime | 文件创建时间 |
filemtime | 文件修改时间 |
fileatime | 文件上次访问时间 |
1 |
|
说明:
- 上例中我为了写入文件,把文件加上了独占锁。
- 如果我操作完成,写入完成后,解除掉了独占锁。
 
 
八. 目录(文件夹)处理函数
处理文件夹的基本思想如下:
- 读取某个路径的时候判断是否是文件夹
- 是文件夹的话,打开指定文件夹,返回文件目录的资源变量
- 使用readdir读取一次目录中的文件,目录指针向后偏移一次
- 使用readdir读取到最后,没有可读的文件返回false
- 关闭文件目录
 
常用函数:
函数名 | 功能 |
---|---|
opendir() | 打开文件夹,返回操作资源  [PHP opendir() 函数] |
readdir() | 读取文件夹资源,返回目录中下一个文件的文件名。  [PHP readdir() 函数] |
is_dir() | 判断是否是文件夹  [PHP is_dir() 函数] |
closedir() | 关闭文件夹操作资源  [PHP is_dir() 函数] |
filetype() | 显示是文件夹还是文件,文件显示file,文件夹显示dir 可能的类型:(fifo、char、dir、block、link、file、unknown) [PHP is_dir() 函数] |
 
 
九. 文件权限设置
文件权限设置的函数在系统管理级别的软件中很常用。
例如:某个文件不准许guest组(来宾用户)查看。在企业管理中,某些用户或者某些用户文件只准读取不准修改。这都是非常常用的功能。
注:windows下面有些功能无法实现。
函数名 | 功能 |
---|---|
chmod | 修改读取模式 |
chgrp | 修改用户组 |
chown | 修改权限 |
上面的函数用法与linux的权限操作的用法一样。
 
chmod 主要是修改文件的的权限
1 |
|
 
 
十. 文件路径函数
我们经常会遇到处理文件路径的情况。
- 文件后缀需要取出来
- 路径需要取出名字不取目录
- 只需要取出路径名中的目录路径
- 或者把网址中的各个部份进行解析取得独立值
- 甚至是自己组成一个url出来
……
 
常用路径处理函数:
函数名 | 功能 |
---|---|
pathinfo() | 返回文件的各个组成部份 |
basename() | 返回文件名 |
dirname() | 文件目录部份 |
parse_url() | 网址拆解成各部份 |
http_build_query() | 生成url 中的query字符串 |
http_build_url() | 生成一个url |
 
10.1 pathinfo()函数
功能:以关联数组的形式返回文件路径的信息
pathinfo(path,options)
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 [PHP pathinfo() 函数] |
process_sections | 可选。规定要返回的数组元素。默认是 all。 可能的值: PATHINFO_DIRNAME - 只返回 dirname PATHINFO_BASENAME - 只返回 basename PATHINFO_EXTENSION - 只返回 extension |
1 |
|
 
10.2 basename()函数
功能:返回路径中不带有文件扩展名的文件名
basename(path[,suffix])
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 [PHP basename() 函数] |
suffix | 可选。指定文件名到了指定字符停止。 |
1 |
|
 
10.3 dirname()函数
功能:返回文件路径的文件目录部份,不包含文件名。
dirname(path)
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 [PHP dirname() 函数] |
1 |
|
 
10.4 parse_url()函数
功能:将网址拆解成各个部份,返回一个数组
mixed parse_url ( string $路径 )
1 |
|
 
10.5 http_build_query()函数
功能:生成url 中的query字符串
string http_build_query ( mixed $需要处理的数据)
1 |
|
注:PHP_EOL 常量
在 windows平台相当于 echo “\r\n”;
在unix\linux平台相当于 echo “\n”;
在mac平台相当于 echo “\r”;
 
 
十一. 文件系统实例案例
11.1 文件留言本
先来说两个下面用到的两个字符串函数和一个数组函数:
[trim()函数]:移除字符串两侧的空白字符或其他预定义字符。
[explode()函数]:把字符串打散为数组。
[each()函数]:返回当前元素的键名和键值。该元素的键名和键值返回到带有四个元素的数组中。
 
[视频教程]
1. 文件结构:
index.php —展示输入框和留言内容,并将内容提交到write.php;
write.php —接收并处理来自index.php的内容,然后向message.txt写入数据;
message.txt —接收并存入来自write.php的聊天内容。
index.php文件:
1 |
|
 
write.php文件:
1 |
|
 
步骤1:在www目录下的index.php里面复制上面相对应的内容、新建一个write.php文件并复制相应的内容、新建一个message.txt空文件;
步骤2:运行index.php如下:
 
步骤3:向留言框输入文字并点击提交
 
11.2 修改配置文件
[视频教程]