1.文件介绍
我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只
读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事
情了:可不可以写入修改配置文件、是不是可以做PHP安装的时候检测文件的权限、是不是可以做生成Html文件
等等很多不同的操作,总之其他太多太多的地方用到了文件操作。
2.简单的读取文件
2.1readfile函数
readfile( "文件路径" )
会直接将文件内容打印在控制台
<?php
readfile('test.txt')
?>
2.2file_get_content函数
<?php
$filename = 'test.txt';
$filestring = file_get_contents($filename); //打开文件把内容读出来,赋值$filestring
echo $filest
ring;
?>
3.文件操作三步骤
3.1fopen打开文件
当你用fopen打开一个文件之前,应该先指定好模式
常见模式 :
- r模式 只读
- w模式 只写
- a模式 追加模式
fopen的8种模式
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
<?php
$fp = fopen('test.txt','r');
echo var_dump($fp);
// resource(5) of type (stream)
$fp = fopen('test1.txt','r');
echo var_dump($fp);
// bool(false)
?>
3.2读操作
逐行读取文件
gets() 函数用于从文件中逐行读取文件。
注释:在调用该函数之后,文件指针会移动到下一行。
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
// feof($file)判断文件指针是否在文件末尾
{
echo fgets($file); // 读取文件内容,自动换行
}
fclose($file);
?>
逐字符读取文件
fgetc() 函数用于从文件中逐字符地读取文件。
注释:在调用该函数之后,文件指针会移动到下一个字符。
<?php
$file=fopen("text.txt","r");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
3.3写操作
注意 : 想要向文件中写入内容,必须先指定模式为w
<?php
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自南方的狼,却在北方冻成了狗');
fclose($fp);
print $len .'字节被写入了\n';
?>
// 代码说明:
// 不论有没有新建都会打开文件重新写入
// 原有的文件内容会被覆盖掉
// 文件不存在会创建
3.4关闭文件
因为计算机不会像人类那么聪明,你不告诉他关闭文件,它是不会自己关闭文件的,所以当你打开文件,然后操作
完成后 ,一定要注意要关闭文件。
<?php
$fp = fopen('test.txt','w');
fwrite($fp,'晚上吃什么?');
fclose($fp);
?>
4.php 创建临时文件
我们之前创建的文件都是永久文件,而创建临时文件在我们平时的项目开发中也非常有用,创建临时文件的好处:
文件操作完成后即删除,不需要去维护这个文件的删除状态。
<?php
//创建了一个临时文件
$handle = tmpfile();
//向里面写入了数据
$numbytes = fwrite($handle, '写入临时文件');
//关闭临时文件,文件即被删除
fclose($handle);
echo '向临时文件中写入了'.$numbytes . '个字节';
?>
5.其他文件操作
5.1重命名文件
rename($旧名,$新名)
功能:这个函数返回一个bool值,将旧的名字改为新的名字。
<?php //旧文件名 $filename = 'test.txt'; //新文件名 $filename2 = 'new_test.txt'; //重名名文件 rename($filename, $filename2);?>
5.2复制文件
复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西,两个长得一模一样。
copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
<?php //旧文件 $filename = 'demo.txt'; //新文件 $filename2 = 'demo_copy.txt'; //复制文件 copy($filename, $filename2);?>说明:会通过上面的例子,发现多出来了一个文件。
5.3删除文件
删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不
到这个文件,你只会发现这个文件被删除了。
unlink(指定路径的文件)
返回一个bool值
<?php $filename = 'test.txt'; if (unlink($filename)) { echo "删除文件成功 $filename!\n"; } else { echo "删除 $filename 失败!\n"; }?>
5.4检测文件属性函数
常用文件属性函数:
序号 | 函数信息 | 说明 |
---|---|---|
1 | file_exists( $指定文件名或者文件路径) | 文件是否存在。 |
2 | is_readable ( $指定文件名或者文件路径) | 文件是否可读 |
3 | is_writeable ( $指定文件名或者文件路径) | 文件是否可写 |
4 | is_executable ( $指定文件名或者文件路径) | 文件是否可执行 |
5 | is_file ( $指定文件名或者文件路径) | 是否是文件 |
6 | is_dir ( $指定文件名或者文件路径) | 是否是目录 |
7 | void clearstatcache ( void ) | 清楚文件的状态缓存 |
<?php $filename = 'test.txt'; echo var_dump(file_exists($filename)) // 返回bool值?>
6.目录处理函数
php 目录处理函数处理文件夹的基本思想如下:
-
读取某个路径的时候判断是否是文件夹
-
是文件夹的话,打开指定文件夹,返回文件目录的资源变量
-
使用readdir读取一次目录中的文件,目录指针向后偏移一次
-
使用readdir读取到最后,没有可读的文件返回false
-
关闭文件目录
我们来学习一下常用函数
序号 | 函数信息 | 说明 |
---|---|---|
1 | opendir | 打开文件夹,返回操作资源 |
2 | readdir | 读取文件夹资源 |
3 | is_dir | 判断是否是文件夹 |
4 | closedir | 关闭文件夹操作资源 |
5 | filetype | 显示是文件夹还是文件,文件显示file,文件夹显示dir |
<?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 | pathinfo | 返回文件的各个组成部分 |
2 | basename | 返回文件名 |
3 | dirname | 文件目录部份 |
<?php $path_parts = pathinfo('d:/www/index.php'); echo '文件目录名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件扩展名:'.$path_parts['extension']."<br />"; echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; ?>
7.php实现文件留言本
index.php
<?php//设置时区date_default_timezone_set('PRC');//读了内容@$string = file_get_contents('message.txt');//如果$string 不为空的时候执行,也就是message.txt中有留言数据if (!empty($string)) { //每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉 $string = rtrim($string, '&^'); //以&^切成数组 $arr = explode('&^', $string); //将留言内容读取 foreach ($arr as $value) { //将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<hr />'; }}?><h1>基于文件的留言本演示</h1><form action="write.php" method="post"> 用户名:<input type="text" name="username" /><br /> 留言内容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /></form>
write.php
<?php//追加方式打开文件$fp=fopen('message.txt','a');//设置时间$time=time();//得到用户名$username=trim($_POST['username']);//得到内容$content=trim($_POST['content']);//组合写入的字符串:内容和用户之间分开,使用$#//行与行之间分开,使用&^$string=$username.'$#'.$content.'$#'.$time.'&^';//写入文件fwrite($fp,$string);//关闭文件fclose($fp);header('location:index.php');?>