PHP文件处理
PHP 拥有的多种函数可供创建、读取、上传以及编辑文件。
注意:请谨慎操作文件!
当您操作文件时必须非常小心。如果您操作失误,可能会造成非常严重的破坏。
常见的错误是:
1.编辑错误的文件
2.被垃圾数据填满硬盘
3. 意外删除文件内容
PHP readfile()函数
readfile($文件名)
功能:传入一个文件路径,输出一个文件
例如 有个名为file.txt 的文件,内容如下
Welcome in the PHP Chinese learning PHP
用readfile()函数读取此文件并写到输出流的 PHP 代码如下(如读取成功则 readfile() 函数返回字节数):
字节数:英文占一个字节 gbk编码中文占2个 utf-8中文占3个 空格和符号占1个
<?php echo readfile("D:WWW/item/file.txt"); ?>
程序运行结果:
Welcome in the PHP Chinese learning PHP39
file_get_contents打开文件
上面的是单纯打文件就直接输出了,有没有打开文件后,能够赋值给一个变量的操作方式呢。
PHP当然会提供这种方式。这个方式就是PHP打开文件并返回内容的方式之一,我们来看看函数:
file_get_contents ( string filename)
功能:传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。
例如 有个file.txt 的文件,内容如下:
I use the file_get_contents open
使用 file_get_contents 打开
<?php $fileName="file.txt"; $filestring = file_get_contents($fileName); echo $filestring; ?>
程序运行结果:
I use the file_get_contents open
fopen、fread、fclose操作读取文件
fopen ($文件名, 模式)
fread ($操作资源, 读取长度)
fclose ($操作资源 )
通过上面的函数我们来讲解资源类型的通常操作方式:
1. 打开资源
2. 使用相关函数进行操作
3. 关闭资源
fopen函数 fopen函数的功能是打开文件,参数主要有两个:
1. 文件打开的路径
2. 打开文件的模式
资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。
fread函数 函数的功能的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。
fclose函数 fclose函数的功能是关闭资源。资源有打开就有关闭。
fopen的模式(下表):
模式 | 说明 |
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
t | windows下将\n转为\r\n |
b | 二进制打开模式 |
1.打开文件
file.txt 文件的内容如下
You're welcome
<?php //你可以创建一个file.txt,以只读模式打开 $fp = fopen('file.txt', "r"); //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource var_dump($fp); ?>
2.读取文件
<?php $fp = fopen('file.txt', "r"); //打开一个文件类型后,读取12个字节 $contents = fread($fp, 12); ?>
3,关闭文件
<?php $fp = fopen('file.txt', 'r'); $contents = fread($fp, 1024); fclose($fp); echo $contents; ?>
程序运行结果:
You're welcome
file_put_contents和fwrite写入文件
file_put_contents ( string $文件路径, string $写入数据])
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $data = "我是一个兵,来自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '写入成功,我们读取看看结果试试:'; echo file_get_contents('binggege.txt'); }else{ echo '写入失败或者没有权限,注意检查'; } ?>
程序运行结果:
写入成功,我们读取看看结果试试:我是一个兵,来自老百姓
fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
注:fwrite的别名函数是fputs
我们上面试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入
实例
你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $filename = 'test.txt'; $fp= fopen($filename, "w"); $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘'); fclose($fp); print $len ."字节被写入了\n"; ?>
程序运行结果:
66字节被写入了
总结:
1.不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建
对比一下以下几个模式的不同:
模式 | 说明 |
r | 只能读不能使用fwrite写 |
r+ | 可操作读、写 |
w | 只可以写功能 |
w+ | 即可读又可以写 |
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $filename = 'test.txt'; $fp= fopen($filename, "r"); $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘'); fclose($fp); print $len .'字节被写入了\n'; ?>
程序运行结果:
0字节被写入了\n
我们发现只用 r 的话 写入是不成功的
创建临时文件
我们之前创建的文件都是永久文件。
而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处
1. 用完后即删除
2. 不需要去维护这个文件的删除状态
例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。
就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。
我们来学习一下这个函数:
resource tmpfile ( )
功能:创建一个临时文件,返回资源类型。关闭文件即被删除。
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $handle = tmpfile(); //向里面写入了数据 $numbytes = fwrite($handle, '写入临时文件的内容'); //关闭临时文件,文件即被删除 fclose($handle); echo '向临时文件中写入了'.$numbytes . '个字节'; ?>
程序运行结果:
向临时文件中写入了27个字节
移动,拷贝,删除文件
重命名文件
rename($旧名,$新名);
这个函数返回一个bool值,将旧的名字改为新的名字。
实例
<?php $fileName1="text.txt"; $fileName2="text--1.txt"; rename($fileName1,$fileName2); ?>
上面的例子就是将一个text.txt的文件 改名为text--1.txt 的例子,你不妨可以试下
复制文件
copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
实例
<?php $filename = 'file.txt'; //旧文件名 $filename2 = 'copy-file.txt'; //新文件名 copy($filename, $filename2); //修改名字。 ?>
上面的例子是将一个文件名为 file.txt的文件,复制一份名为 copy-file.txt 的文件,内容一样。
删除文件
unlink (指定路径的文件)
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $filename = 'test.txt'; unlink($filename); ?>
上面的例子是将一个文件名为 test.txt的文件删除
文件常用的函数
filesize 检测文件的大小
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $filename = 'file.txt'; echo $filename . '文件大小为: ' . filesize($filename) . ' bytes'; ?>
程序运行结果:
file.txt文件大小为: 14 bytes
其他操作文件的函数,读取文件
函数名 | 功能 |
file | 把整个文件读入一个数组中 |
fgets | 从文件指针中读取一行,读到最后返回false |
fgetc | 从文件指针中读取一个字符,读到最后返回false |
ftruncate | 将文件截断到给定的长度 |
我们通过一个实例来把上面几个函数都用到。
我们在text.txt文件中写入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
fgetc每次读取一个
<?php //以增加的r模式打开 $fp = fopen('text.txt','r+'); //你分发现每次只读一个字符 echo fgetc($fp) ."<br>"; //我要全部读取可以,读取一次将结果赋值一次给$string while($string = fgetc($fp)){ echo $string; } ?>
程序运行结果:
a
bcdeefghijklk opqrst uvwxyz 12345678
fgets每次打开一行:
<?php //以增加的r模式打开 $fp = fopen('text.txt','r+'); //你分发现每次只读一个字符 echo fgets($fp)."<br>"; echo fgets($fp)."<br>"; echo fgets($fp)."<br>"; echo fgets($fp); ?>
程序运行结果:
abcdeefghijklk
opqrst
uvwxyz
12345678
文件截取函数
<?php //打开我们上面的text.txt文件 $file = fopen("text.txt", "a+"); //你可以数数20个字有多长,看看是不是达到效果了 echo ftruncate($file,10); fclose($file); ?>
运行一下程序,可以打开text.txt 文件,看一下是不是有20的字节
文件的时间函数
函数 | 功能说明 |
filectime | 文件创建时间 |
filemtime | 文件修改时间 |
fileatime | 文件上次访问时间 |
实例
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $filename = 'text.txt'; if (file_exists($filename)) { echo "$filename"."文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename))."<br>"; echo "$filename"."文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename))."<br>"; echo "$filename"."文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename)); } ?>
程序运行结果:
text.txt文件的上次访问时间是: 2016-09-13 17:44:40
text.txt文件的创建时间是: 2016-09-13 17:32:16
text.txt文件的修改时间是: 2016-09-13 17:44:55
目录处理函数
之前我们处理的全都是文件,那目录和文件夹怎么处理呢?
我们就来学习目录或者称为文件夹的处理相关函数。
处理文件夹的基本思想如下:
1. 读取某个路径的时候判断是否是文件夹
2. 是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3. 使用readdir读取一次目录中的文件,目录指针向后偏移一次
4. 使用readdir读取到最后,没有可读的文件返回false
5. 关闭文件目录
我们来学习一下比较常用函数:
函数名 | 功能 |
opendir | 打开文件夹,返回操作资源 |
readdir | 读取文件夹资源 |
is_dir | 判断是否是文件夹 |
closedir | 关闭文件夹操作资源 |
filetype | 显示是文件夹还是文件,文件显示file,文件夹显示dir |
实例
<?php //设置打开的目录是D盘 $dir = "D:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取一次向后移动一次文件夹指针 echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; //读取到最后返回false //关闭文件夹资源 closedir($dh); } } ?>
可以运行一下程序,看看是不是你电脑D盘的目录
判断文件的类型
<?php //设置打开的目录是D盘 $dir = "D:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取到最后返回false,停止循环 while (($file = readdir($dh)) !== false) { echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
运行程序看看
文件路径函数
我们经常会遇到处理文件路径的情况。
例如:
1. 文件后缀需要取出来
2. 路径需要取出名字不取目录
3. 只需要取出路径名中的目录路径
4. 或者把网址中的各个部份进行解析取得独立值
5. 甚至是自己组成一个url出来
很多地方都需要用路径处理类的函数。
我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:
函数名 | 功能 |
pathinfo | 返回文件的各个组成部份 |
basename | 返回文件名 |
dirname | 文件目录部份 |
parse_url | 网址拆解成各部份 |
http_build_query | 生成url 中的query字符串 |
http_build_url | 生成一个url |
pathinfo
pathinfo ( string $路径)
功能:传入文件路径返回文件的各个组成部份
实例
<?php header("Content-type:text/html;charset=utf-8"); $path_parts = pathinfo('D:/www/a.html'); echo '文件目录名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件扩展名:'.$path_parts['extension']."<br />"; echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; ?>
程序运行结果:
文件目录名:D:/www
文件全名:a.html
文件扩展名:html
不包含扩展的文件名:a
basename
basename ( string $路径[, string $suffix ])
功能:传入路径返回文件名
第一个参数传入路径。
第二个参数,指定我文件名到了指定字符停止。
实例
<?php echo "1: ".basename("d:/www/a.html", ".d")."<br>"; echo "2: ".basename("d:/www/include")."<br>"; echo "3: ".basename("d:/www/text.txt")."<br>"; ?>
程序运行结果:
1: a.html
2: include
3: text.txt
dirname
dirname(string $路径)
功能:返回文件路径的文件目录部份
实例
<?php $a=dirname(__FILE__); echo$a; ?>
运行一下你的程序
parse_url
parse_url ( string $路径 )
功能:将网址拆解成各个部份
实例
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
程序运行结果:
array(8) {
["scheme"]=>
string(4) "http"
["host"]=>
string(8) "hostname"
["port"]=>
int(9090)
["user"]=>
string(8) "username"
["pass"]=>
string(8) "password"
["path"]=>
string(5) "/path"
["query"]=>
string(9) "arg=value"
["fragment"]=>
string(6) "anchor"
}
http_build_query
http_build_query ( mixed $需要处理的数据)
功能:生成url 中的query字符串
实例
<?php //定义一个关联数组 $data = [ 'username'=>'liwenkai', 'area'=>'hubei', 'pwd'=>'123' ]; //生成query内容 echo http_build_query($data); ?>
程序运行结果:
username=liwenkai&area=hubei&pwd=123
PHP Filesystem 参考手册
如需查看 PHP 文件系统函数的完整参考手册,请访问我们的PHP Filesystem 参考手册。