一、文件系統概述
1、文件類型
UNIX系統中7中文件類型說明
文件類型 | 描述 |
Block | 塊設備文件,如某個磁盤分區,軟驅,光驅CD-ROW等 |
Char | 字符設備是指在I/O傳輸過程中以字符爲單位進行傳輸的設備,例如鍵盤、打印機等 |
Dir | 目錄類型,目錄也是文件的一種 |
Fifo | 命名管道,常用於將信息從一個進程傳輸到另一個進程 |
File | 普通文本類型,如文本文件或可執行文件等 |
Link | 符號鏈接,是指向文件指針的指針,類似windows中的快捷方式 |
Unknown | 未知類型 |
在PHP中,可以通過filetype()函數獲取文件的上述類型,該函數接受一個文件名作爲參數。
對於一個已知的文件,可以使用is_file()函數判斷給定的文件名是否爲一個正常的文件;使用is_dir()函數判斷給定的文件名是否是一個目錄;使用is_link()函數判斷給定的文件名是否爲一個符號鏈接。
2、文件屬性
PHP的文件屬性處理函數
函數名 | 作用 | 參數 | 返回值 |
file_exists() | 檢查文件或目錄是否存在 | 文件名 | 存在返回TRUE |
filesize() | 取得文件大小 | 文件名 | 返回文件大小的字節數 |
file_readable() | 判斷給定文件名是否可讀 | 文件名 | TRUE 或者FALSE |
file_writable() | 判斷給定文件名是否可寫 | 文件名 | TRUE 或者FALSE |
file_executable() | 判斷給定文件名是否可執行 | 文件名 | TRUE 或者FALSE |
filectime() | 取得文件的創建時間 | 文件名 | 返回UNIX時間戳格式 |
filemtime() | 取得文件的修改時間 | 文件名 | 返回UNIX時間戳格式 |
fileatime() | 取得文件的訪問時間 | 文件名 | 返回UNIX時間戳格式 |
stat() | 獲取文件大部分屬性值 | 文件名 | 返回關於給定文件有用信息的數組 |
<?php
// /**
// 聲明一個函數,通過傳入一個文件名稱獲取文件大部分屬性
// */
function filetyp($filename){
//如果提供的文件或目錄不存在,則直接退出函數
if(!file_exists($filename)){
echo "目標文件不存在!!!"."<br/>";
return;
}
//判斷是否是一個普通文件
if(is_file($filename)){
echo $filename."是一個文件"."<br/>";
}
//判斷是否是一個目錄
if(is_dir($filename)){
echo $filename."是一個目錄"."<br/>";
}
//用定義的函數輸出文件形態
echo "文件形態:".filetype($filename)."<br/>";
//獲取文件大小,並自定義轉換單位
echo "文件大小".filesize($filename)."<br/>";
if(is_readable($filename)){
echo "該文件可讀"."<br/>";
}
if(is_writable($filename)){
echo "該文件可寫"."<br/>";
}
if(is_executable($filename)){
echo "該文件可執行"."<br/>";
}
echo "文件建立時間:".date("Y年m月d日",filectime($filename))."<br/>";
echo "文件修改時間:".date("Y年m月d日",filemtime($filename))."<br/>";
echo "文件訪問時間:".date("Y年m月d日",fileatime($filename))."<br/>";
}
/**
聲明一個函數,用來返回文件的類型
*/
function gfiletype($fileName){
switch(filetype($fileName)){
case "file": $type."=普通文件"; break;
case "dir": $type."=目錄文件"; break;
case "block": $type."=塊設備文件"; break;
case "char": $type."=字符設備文件"; break;
case "fifo": $type."=命名管道文件"; break;
case "link": $type."=符合鏈接"; break;
case "unknown": $type."=未知類型"; break;
default: $type."=沒有檢測到類型"; break;
}
return $type;
}
/**
自定義一個文件大小單位轉換函數
*/
function gfilesize($bytes){
if($bytes>=pow(2,40)){
$return=round($bytes/pow(1024,4),2);
$suffix="TB";
}
elseif($bytes>=pow(2,30)){
$return=round($bytes/pow(1024,3),2);
$suffix="GB";
}
elseif($bytes>=pow(2,20)){
$return=round($bytes/pow(1024,2),2);
$suffix="MB";
}
elseif($bytes>=pow(2,10)){
$return=round($bytes/pow(1024,1),2);
$suffix="KB";
}
else{
$return=$bytes;
$suffix="byte";
}
return $return." ".$suffix;
}
//調用自定義函數,將當前目錄下的t2.php文件傳入,獲取屬性
filetyp("t2.php");
?>
代碼運行結果爲:
二、目錄的基本操作
1、解析目錄路徑
在系統的每個目錄下,都有兩個特殊的目錄“.”和“..”,分別指示當前目錄和當前目錄的父目錄(上一級目錄)。
2、遍歷目錄
即瀏覽某個目錄下面的文件。
(1)函數operdir()用於打開指定目錄,接受一個目錄的路徑及目錄名作爲參數。
(2)函數readdir()用於讀取指定目錄,接受已經用operdir()函數打開的可操作目錄句柄作爲參數。
(3)函數closedir()用於關閉指定目錄,接受已經用operdir()函數打開的可操作目錄句柄作爲參數。
(4)函數rewinddir()倒回目錄句柄,接受已經用operdir()函數打開的可操作目錄句柄作爲參數。
下面用一個實例來說明以上幾個函數的使用方法。注意,在使用該例子前請確保同一目錄下有phpMyAdmin文件夾。
<?php
$num=0;
$dirname="phpMyAdmin"; //dirname可用其他字母代替
$dir_handle=opendir($dirname); //dir_handle可用其他字母代替
//將遍歷的目錄和文件名使用表格格式輸出
echo "<table text-align='center' width='600' cellspacing='0' cellpading='0'>";
echo "<caption><h2>目錄".$dirname."下面的內容</h2></caption>";
echo "<tr text-align='left' bgcolor='#ffffff'>";
echo "<th>文件名</th><th>文件大小</th><th>文件類型</th><th>修改時間</th>";
echo "</tr>";
//使用readdir循環讀取目錄裏的內容
while($file=readdir($dir_handle)){ //file可用其他字母代替
//將目錄下的文件和當前目錄鏈接起來,才能在程序中使用
$dirfile=$dirname."/".$file; //dirfile可用其他字母代替
$bgcolor=$num++%2==0 ? "#ffffff" :"#cccccc";
echo "<tr bgcolor='.$bgcolor.'>";
echo '<td>'.$file.'</td>';
echo '<td>'.filesize($dirfile).'</td>';
echo '<td>'.filetype($dirfile).'</td>';
echo '<td>'.date('Y/m/d',filemtime($dirfile)).'</td>';
echo "</tr>";
}
echo "</table>";
closedir($dir_handle);
echo "在<b>".$dirname."</b>目錄下的子目錄和文件共有".$num. "個";
?>
程序運行結果如下所示:
3、統計目錄大小
用filesize()函數計算文件大小,用disk_free_space()和disk_total_space()兩個函數統計磁盤大小。
<?php
/**
自定義一個函數dirsize()統計傳入參數的目錄大小
@param string $directory 目錄名稱
@return double 目錄的尺寸大小
*/
function dirsize($directory){
$dir_size=0; //用來累加各個文件大小
if($dir_handle=opendir($directory)){ //打開目錄,並判斷是否能成功打開
while($filename=readdir($dir_handle)){ //循環遍歷目錄下的所有文件
if($filename!="."&&$filename!=".."){ //一定要排除兩個特殊的目錄
$subfile=$directory."/".$filename; //將目錄下的子文件和 當前目錄相連
if(is_dir($subfile)){ //如果爲目錄
$dir_size+=dirsize($subfile); //遞歸地調用自 身函數,求子目錄的大小
}
if(is_file($subfile)){ //如果是文件
$dir_size+=filesize($subfile); //求出文件的大 小並累加
}
}
}
closedir($dir_handle);
return $dir_size; //返回計算後的目錄大小
}
}
$dir_size=dirsize("phpMyAdmin");
echo round($dir_size/pow(1024,1),2)."KB"; //字節數轉換爲KB單位
?>
4、建立和刪除目錄
在PHP中,使用mkdir()函數只需要傳入一個目錄名就可以很容易地建立一個新目錄。但刪除目錄所用的函數rmdir()只能刪除一個空目錄並且目錄必須存在。如果是非空的目錄就需要先進入到目錄中,使用unlink()函數將目錄中的每個文件都刪掉,再回來將這個空目錄刪除。如果目錄中還存在子目錄,而且子目錄也非空,就要使用遞歸的方法了。自定義遞歸函數刪除目錄的代碼程序如下所示:
<?php
/**
自定義函數遞歸地刪除整個目錄
@param string $directory 目錄名稱
*/
function deldir($directory){
if(file_exists($directory)){ //如果不存在rmdir()函數會出錯
if($dir_handle=opendir($directory)){ //打開目錄並判斷是否成功
while($filename=readdir($dir_handle)){ //循環遍歷函數
if($filename!="."&&$filename!=".."){ //一定要排除兩個特 殊的目錄
$subfile=$directory."/".$filename; //將目錄下的 文件和當前目錄連接
if(is_dir($subfile)){ //如果是目錄
deldir($subfile); //遞歸調用自己刪 除子目錄
}
if(is_file($subfile)){ //如果是文件
unlink($subfile); //直接刪除這個文 件
}
}
}
closedir($dir_handle);
rmdir($directory);
}
}
}
deldir("phpMyAdmin");
?>
5、複製目錄