[TOC]
## 【文件/目录】相关函数
> [ 文件/目录函数参考](http://php.net/manual/zh/refs.fileprocess.file.php)
>
### 操作步骤
* opendir ==>(打开路径) 得到一个资源
* readdir ==>(读取资源)
* rewinddir ==>重置目录指针
* closedir ==>关闭目录句柄(释放资源)
* scandir ==>浏览目录
* disk_free_space -- 返回目录中的可用空间
* disk_total_space -- 返回一个目录的磁盘总大小
*
### 文件目录处理相关函数
* filetype ==> 获取文件类型
* file_exists ==>判断文件或者目录是否存在
* is_readable ==> 判断给定文件名是否可读
* is_writable ==> 判断给定的文件名是否可写
* is_executable ==> 判断给定文件名是否可执行
* is_dir ==>判断是否是个路径
* is_link() ==> 判断给定文件名是否为一个符号连接(软连接)【可以理解为快捷方式】
* is_file ==>判断是否是个文件
* mkdir ==>创建文件夹
* redir ==>删除文件夹
* getcwd ==>获取当前操作目录
* chdir ==>改变当前操作目录
* dirsize() ==>获得目录大小
* filesize() ==>获得文件大小
* filectime() ==>获取文件的**创建时间**
* filemtime() ==>获取文件的**修改时间**
* fileatime() ==>获取文件的**访问时间**
* stat() ==>获取文件大部分属性
### PHP文件路径相关函数
* basename ==> 返回路径中的文件名部分
* pathinfo ==> 返回文件路径的信息
* realpath ==> 返回规范化的绝对路径名
### 文件操作相关函数
* file_get_contents() ==>获取文件的全部内容
* file_put_contents() ==>向某个文件写入内容 FILE_APPEND 参数表示追加
* file() ==>把整个文件读入一个数组,返回一个数组(数组中的每个元素都是文件中的一行数据)
* copy() ==>拷贝
* unlink() ==>删除文件
* rename() ==>重命名
* filetime() ==>获取文件最后被修改的时间
* fileperms() ==>获取文件的权限(返回一个八进制结果)
### 文件操作相关函数2
* fopen($filename, $mode [,$use_include_path, context]) ==> 打开文件或者 URL
* feof() ==> 函数检测是否已到达文件末尾 (eof)。
* fgets() ==> 读取**单行**文件
* fgetc() ==> 读取**单字符**
* fread() ==> 读取打开的文件。【fread($myfile, filesize("webdictionary.txt"));】
* fwrite($handle, $string [, $length]) ==> 用于写入文件。
* fclose() ==> 函数关闭一个打开文件。
```
<?php
$file = fopen("E:/text.txt","r");
if ($file){
//接着采用while循环(后面语言结构语句中的循环结构会详细介绍)一行行地读取文件,然后输出每行的文字
while (!feof($file)) { //判断是否到最后一行
$line = fgets($file); //读取一行文本
echo $line; //输出一行文本
echo "<br />"; //换行
}
}
fclose($file);//关闭文件
```
#### fopen($filename, $mode) $mode参数
1. **r** ===> 【读】打开文件为只读。文件指针在文件的开头开始。
2. **r+** ===> 【从头写、读】读/写。指针定位在文件的开头,如果文件不存会报错。
3. **w** ===> 【覆盖写】只写。打开并清空文件的内容,如果文件不存在,则创建新文件。
4. **w+** ===> 【覆盖写、读】读/写。打开并清空文件的内容,如果文件不存在,则创建新文件。
5. **a** ===> 【追加】追加。打开并将指针定位在文件尾,如果文件不存在,则创建新文件。
6. **a+** ===> 【读/追加】读/追加。打开并将指针定位在文件尾,如果文件不存在,则创建新文件。
7. **x** ===> 【只写】只写。创建新文件。如果文件以存在,则返回 FALSE。
8. **x+** ===> 【读/写】读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
#### 使用fopen()打开中文名的文件
不能直接用fopen()来打开中文名的文件,这里,我们需要进行一些处理
```
// 使用这行代码即可解决,可以正常的打开文件
$file = fopen ( iconv ( 'UTF-8', 'GBK', 'E:/哈哈.txt' ), 'r' );
```
#### fopen()的一些使用问题
1. fopen()函数的使用比起file_get_contents()函数麻烦一些。在大多数情况下,还是使用file_get_contents()函数要方便一些。file_get_contents()的使用方法
2. 在打开比较大的文件的时候,使用file_get_contents()函数会加大内存的占用率,这是非常不合适的。因此这种情况下,更建议使用fopen()函数。
3. 关于为什么每次使用fopen()函数,后面都要用fclose()函数关闭文件的问题。正常来说php的资源会在脚本结束的时候全部释放掉,因此普遍的情况都可以省略fclose。不过如果你fopen了一个很大的文件,早点fclose会比较节省资源。也算是良好编码习惯的一种。
## 文件的属性
![](https://box.kancloud.cn/d048e1a1c3debde49e08853f786c11ee_1061x619.png)
![](https://box.kancloud.cn/fa024c89e457faffaa912c44eaef25ec_1076x596.png)
## 统计一个目录下的文件和目录的个数
```
<?php
$dirn = 0; //目录数
$filen = 0; //文件数
//用来统计一个目录下的文件和目录的个数
function getdirnum($file) {
global $dirn;
global $filen;
$dir = opendir($file);
while($filename = readdir($dir)) {
if($filename!="." && $filename !="..") {
$filename = $file."/".$filename;
if(is_dir($filename)) {
echo '目录---' . $filename . '<br>';
$dirn++;
getdirnum($filename); //递归,就可以查看所有子目录
} else {
echo '文件---' . $filename . '<br>';
$filen++;
}
}
}
closedir($dir);
}
getdirnum(__DIR__);
echo "目录数为:{$dirn}<br>";
echo "文件数为:{$filen}<br>";
// 文件---F:\gitee\a_aliyun_code\demo/demo.php
// 目录---F:\gitee\a_aliyun_code\demo/新建文件夹
// 文件---F:\gitee\a_aliyun_code\demo/新建文件夹/新建文本文档.txt
// 目录数为:1
// 文件数为:2
```
## 文件的锁定机制
flock -- 轻便的咨询文件锁定
语法: bool flock ( int handle, int operation [, int &wouldblock] )
PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。
handle 必须是一个已经打开的文件指针。
operation 可以是以下值之一:
要取得共享锁定(读取程序),将 operation 设为 LOCK_SH。
要取得独占锁定(写入程序),将 operation 设为 LOCK_EX。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN。
如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB。
如果成功则返回 TRUE,失败则返回 FALSE。
```
<?php
/**
* 简单文件留言本
*/
header("Content-Type:text/html;charset=utf8");
$filename = "message.txt";
fopen('aaa.txt', "a");
//如果用户提交了, 就写入文件, 按一定格式写入
if(isset($_POST['dosubmit'])) {
//字段的分隔使用||, 行的分隔使用[n]
$mess = "{$_POST['username']}||".time()."||{$_POST['title']}||{$_POST['content']}[n]";
writemessage($filename, $mess);
}
if(file_exists($filename)) {
readmessage($filename);
}
function writemessage($filename, $mess) {
$fp = fopen($filename, "a");
if(flock($fp, LOCK_EX+LOCK_NB)) {
fwrite($fp, $mess);
flock($fp, LOCK_UN+LOCK_NB);
} else {
echo "写入锁定失败!";
}
fclose($fp);
}
function readmessage($filename) {
// $mess = file_get_contents($filename);
$mess = "";
$fp = fopen($filename, "r");
flock($fp, LOCK_SH+LOCK_NB); //读锁定
while(!feof($fp)) {
$mess.=fread($fp, 1024);
}
flock($fp, LOCK_UN+LOCK_NB); //释放
$mess = rtrim($mess, "[n]");
$arrmess = explode("[n]", $mess);
foreach($arrmess as $m) {
list($username, $dt ,$title, $content) = explode("||", $m);
echo "<b>{$username}</b>, ".date("Y-m-d H:i").": <i>{$title}</i>, <u>{$content}</u><br><hr><br>";
}
fclose($fp);
}
?>
<form action="demo.php" method="post">
用户: <input type="text" name="username" value="" /><br>
标题:<input type="text" name="title" value="" /><br>
内容:<textarea name="content" cols="40" rows="4"></textarea><br>
<input type="submit" name="dosubmit" value="留言" /><br>
</form>
```