1. 前言
我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:
可不可以写入修改配置文件?
是不是可以做PHP安装的时候检测文件的权限
是不是可以做生成Html文件等等很多不同的操作
… 其他太多太多的地方用到了文件操作。
2. fopen、fread、fclose操作读取文件
readfile读取文件:
那如何读取一个文件呢?我们先学一个函数。
int readfile ( string $文件名)
功能:传入一个文件路径,输出一个文件。
下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。
<?php
//linux类的读了方式
readfile("/home/paul/test.txt");
//windows类的读取方式
readfile("c:\\boot.ini");
?>
注意:上面的代码中windows的斜线是 \ 斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。
file_get_contents打开文件
<?php
$filename = 'NoAlike.txt';
$file_string = file_get_contents($filename);
echo $file_string;
?>
fopen、fread、fclose操作读取文件
上面file_get_contents打开文件的方式简单、粗暴。下面的
resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )
fopen的模式有下面几个,我们来讲一下fopen的模式:
模式 | 说明 |
---|---|
r | 只读方式打开,将文件指针指向文件头。 |
r+ | 读写方式打开,将文件指针指向文件头。 |
w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
x+ | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
<?php
//你可以创建一个NoAlike.txt,以只读模式打开
$fp = fopen('NoAlike.txt', "r");
//var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
var_dump($fp);
?>
3. php创建和修改文件内容
file_put_contents写入文件
我们先来学习第一种写入文件的方式:
int file_put_contents ( string $文件路径, string $写入数据])
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
<?php
$data = "在PHP中文网学好PHP,妹子票子不再话下!";
$num_bytes = file_put_contents('big_baby.txt', $data);
if($num_bytes){
echo '写入成功,我们读取看看结果试试:'.PHP_EOL;
echo file_get_contents('big_baby.txt');
}else{
echo '写入失败或者没有权限,注意检查';
}
?>
输出结果为:
写入成功,我们读取看看结果试试:
在PHP中文网学好PHP,妹子票子不再话下!
fwrite配合fopen进行写入操作
<?php
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
fclose($fp);
print $len .'字节被写入了.';
?>
总结:
1.不论有没有新建都会打开文件重新写入。
2.原有的文件内容会被覆盖掉。
3.文件不存在会创建。
那我们来对比一下以下几个模式的不同:
模式 | 说明 |
---|---|
r | 只能读不能使用fwrite写 |
r+ | 可操作读、写 |
w | 只可以写功能 |
w+ | 即可读又可以写 |
x | 每次写入会干掉原有文件的内容,文件不存在都会创建 |
a | 每次写入都会向文件的尾端追加内容 |
注:a+ 是增强的追加功能。可以读取时也可以使用。
4. php创建临时文件
我们之前创建的文件都是永久文件。
而创建临时文件在我们平时的项目开发中也非常有用。
创建临时文件的几个好处:
文完后即删除。
不需要去维护这个文件的删除状态。
<?php
//创建了一个临时文件
$handle = tmpfile();
//向里面写入了数据
$num_bytes = fwrite($handle, '写入临时文件');
//关闭临时文件,文件即被删除
fclose($handle);
echo '向临时文件中写入了' .$num_bytes . '个字节.';
?>
输出结果为:
向临时文件中写入了18个字节.
5. php移动、拷贝和删除文件
我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。
我们先来说重命名,重命名的函数是:
重命名文件
bool rename($ 旧名,$ 新名);
这个函数返回一个bool值,将旧的名字改为新的名字。
<?php
//旧文件名
$filename1 = 'test.txt';
//新文件名
$filename2 = $filename1 . '.old';
//复制文件
rename($filename1, $filename2);
?>
复制文件
复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。
bool copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
我们来通过实验和代码来玩玩:
<?php
//旧文件名
$filename1 = 'copy.txt';
//新文件名
$filename2 = $filename1 . '_new';
//修改名字。
copy($filename1, $filename2);
?>
总结:
你会通过上面的例子,发现多出来了一个文件。
删除文件
删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。
你只会发现,这个文件消失了。
bool unlink(指定路径的文件)
<?php
$filename = 'test.txt';
if (unlink($filename)) {
echo "删除 $filename 文件成功!\n";
} else {
echo "删除 $filename 文件失败!\n";
}
?>
6. 检测文件属性函数
我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。
<?php
if(file_exists('install.lock')){
echo '已安装,请不要再次进行安装';
exit;
}
?>
常用文件属性函数
bool file_exists ( $指定文件名或者文件路径)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径)
功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径)
功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径)
功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路径)
功能:是否是目录
void clearstatcache ( void )
功能:清楚文件的状态缓存
7. php目录处理函数
处理文件夹的基本思想如下:
- 读取某个路径的时候判断是否是文件夹。
- 是文件夹的话,打开指定文件夹,返回文件目录的资源变量。
- 使用readdir读取一次目录中的文件,目录指针向后偏移一次。
- 使用readdir读取到最后,没有可读的文件返回false。
- 关闭文件目录。
函数名 | 功能 |
---|---|
opendir | 打开文件夹,返回操作资源 |
readdir | 读取文件夹资源 |
is_dir | 判断是否是文件夹 |
closedir | 关闭文件夹操作资源 |
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) . "\n";
}
closedir($dh);
}
}
?>
8. php文件权限设置
chmod 主要是修改文件的的权限
<?php
//修改linux 系统/var/wwwroot/某文件权限为755
chmod("/var/wwwroot/index.html", 755);
chmod("/var/wwwroot/index.html", "u+rwx,go+rx");
chmod("/somedir/somefile", 0755);
?>
9. php文件路径函数
我们经常会遇到处理文件路径的情况。
例如:
- 文件后缀需要取出来
- 路径需要取出名字不取目录
- 只需要取出路径名中的目录路径
- 或者把网址中的各个部份进行解析取得独立值
- 甚至是自己组成一个url出来
- …
很多地方都需要用路径处理类的函数。
我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:
函数名 | 功能 |
---|---|
pathinfo | 返回文件的各个组成部份 |
basename | 返回文件名 |
dirname | 文件目录部份 |
http_build_url | 生成一个url |
<?php
$path_parts = pathinfo('d:/php/index.inc.php');
echo '文件目录名:'.$path_parts['dirname']."\n";
echo '文件全名:'.$path_parts['basename']."\n";
echo '文件扩展名:'.$path_parts['extension']."\n";
echo '不包含扩展的文件名:'.$path_parts['filename']."\n";
?>
输出结果为:
文件目录名:d:/php
文件全名:index.inc.php
文件扩展名:php
不包含扩展的文件名:index.inc
10. php实现文件留言本
我们来看一下文件结构:
index.php —展示输入框和留言内容
write.php —向message.txt写入数据
message.txt —存入聊天内容
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 '用户名为:' . $username . "\t内容为:" . $content . "\t时间为:" . date('Y-m-d H:i:s', $time);
echo '用户名为:<font color="green">' . $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>
看了刚刚的展示内容,我们知道文件存储时:
1.段与段之间进行了分割
2.内容与用户之前用一个特殊的符号进行了分割
下面我们来写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');
?>
end