[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> ```