[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會比較節省資源。也算是良好編碼習慣的一種。
## 文件的屬性


## 統計一個目錄下的文件和目錄的個數
```
<?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>
```