PHP對文件和文件夾的操作

PHP對文件和文件夾的操作

1.文件夾的權限屬性

模式 描述
r 具有瀏覽目錄的權限。
w 具有新建,刪除,修改,移動目錄內文件的權限。
x 對目錄了來說該用戶具有進入目錄的權限。

2.常用的文件夾函數

//先檢測文件是否存在
$file=file_exists("C:\Users\李川\Desktop\c#.txt");
var_dump($file);

filesize();  //字節爲單位,只統計文件大小
disk_free_space("C:");  //指定磁盤剩餘空間
disk_total_space("C:");  //指定磁盤總空間

is_readable($file);   //是否可讀
is_writeable($file);  //是否可寫
is_executable($file);  //是否可執行  .exe .sh

fileatime($file);  //訪問時間 都是返回時間戳
filemtime($file); //修改時間
filectime($file);//創建時間 

stat($file); //以數組形式返回文件所有屬性
clearstatcache();  //清除一次文件屬性緩存

var_dump(basename($file));  //返回文件名和後綴
var_dump(dirname($file));  //返回給的路徑,就是除去/filename.txt後的路徑

腳本運行期間,文件狀態如果發生改變,你讀取了文件需要刪除之前未改變的緩存clearstatcache();

2.1 當上傳文件下載文件的時候,如何判斷路徑是/還是\

define('ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR."upload");
echo  ROOT;

DIRECTORY_SEPARATOR是一個返回跟操作系統相關的路徑分隔符php內置命令,在windows上返回\,而在linux或者類unix上返回/,就是這麼個區別,通常在定義包含文件路徑或者上傳保存目錄的時候會用到。

2.2 循環遍歷目錄

//$r=readdir($dir); //遍歷文件目錄,文件不存在返回false,存在的話指針會往下移

重點是:用到了readdir(dir)closedir(dir),會遍歷,操作完closedir(dir);釋放內存,

//返回類型: 資源 目錄句柄
$dir=opendir('../static/images');  //打開一個文件夾,會返回目錄句柄

readdir讀取目錄句柄,如果不爲空,指針下移,繼續讀直到爲false,所以我們在每次移動讀取的時候輸出一行文件名就可以了

**上代碼:**簡單版只判斷當前目錄下的文件,不過記得過濾掉. 和 …

<?php
//返回類型: 資源 目錄句柄
$dir=opendir('../static/images');
if($dir){
    while(($file=readdir($dir))!==false){
        if($file!=='.'$$$file!=='..')
        echo $file."<br/>";
    }
    closedir($dir); //釋放資源
}else  echo "打開目錄失敗!";

遞歸判斷目錄裏面的目錄等直到沒有嵌套文件夾下有沒有文件

<?php
function listdoc($dir){
    if(is_dir($dir)){//判斷是否是目錄
        if($hd = opendir($dir)){//是目錄,則打開
            while($file = readdir($hd)){//循環讀取目錄的文件  
                if((is_dir($dir.'/'.$file)) && ($file !='.') && ($file !='..')){//判斷是否是目錄,並且每個文件夾不是當前和上一級目錄  
                    echo '文件名:'.$file;
                    echo '<br>';
                    listdoc($dir.'/'.$file);//是目錄則遞歸調用
                }else{//不是目錄
                    if($file !='.' && $file !='..'){
                        echo $file;
                        echo '<br>';
                    }
                }
            }
        }
        closedir($hd);
    }else{
        echo '不是一個目錄';
    }
}
listdoc(__DIR__);

2.3 統計目錄大小

首先這個我們就需要遞歸

一個功能函數,因爲返回的都是字節,所以我們來個函數轉換看的舒服的單位

function count_size($bit)
{
    $type = array('Bytes','KB','MB','GB','TB');
    for($i = 0; $bit >= 1024; $i++)//單位每增大1024,則單位數組向後移動一位表示相應的單位
    {
        $bit/=1024;
    }
    return (floor($bit*100)/100).$type[$i];//floor是取整函數,爲了防止出現一串的小數,這裏取了兩位小數
}

其實就是遞歸獲取目錄文件,多了在輸出文件名的時候計算它的文件大小的步驟而已

function listdoc($dir,$size){
    if(is_dir($dir)){//判斷是否是目錄
        if($hd = opendir($dir)){//是目錄,則打開
            while($file = readdir($hd)){//循環讀取目錄的文件  
                if((is_dir($dir.'/'.$file)) && ($file !='.') && ($file !='..')){//判斷是否是目錄,並且每個文件夾不是當前和上一級目錄  
                    echo '文件名:'.$file;
                    echo '<br>';
                    listdoc($dir.'/'.$file,$size);//是目錄則遞歸調用
                }else{//不是目錄
                    if($file !='.' && $file !='..'){

                        echo "文件名:".$file."   "."文件大小:".count_size(filesize($file));
                        $size+=filesize($file);
                        echo '<br>';
                    }
                }
            }
        }
        closedir($hd);
        return $size;
    }else{
        echo '不是一個目錄';
    }
}

$s=listdoc(__DIR__,0);
echo "該文件夾總大小:".count_size($s);

2.4 創建和刪除目錄

mkdir('./test609/1701'); //必須要有父級目錄test609存在才能創建1701文件夾
rmdir('./test609/1701');  //非空就不能刪除,首先清空最底層的文件
unlink(path);//刪除普通文件

一般情況都是有多級目錄的,所以需要遞歸實現

<?php
function  Directory( $dir ){
    return   is_dir ( $dir )  or  Directory(dirname( $dir ))  and   mkdir ( $dir , 0777);
}
Directory(__DIR__.'/hello/777');

實現思路大致如下,核心是短路運算

is_dir ( $dir ) or (Directory(dirname( $dir )) and mkdir ( $dir , 0777));

先判斷目標目錄是否存在,若存在,依or的短路特性,後面的整體被短路,跳過執行;若目標目錄不存在,則執行後面的函數體:

Directory(dirname( $dir )) and mkdir ( $dir , 0777)

dirname(__DIR__.'/hello/777')); //輸出會去掉最底層的名字  

我考慮了一下先進行遞歸的用意:先執行遞歸,意在確認其父目錄(dirname($dir))都已經創建完畢,使後面的mkdir()函數不會創建子目錄時找不到父目錄發出警告。

進入遞歸深處後,確認最深處的根目錄存在後,從根目錄向下依次創建目錄。

刪除目錄 (遞歸實現)

function rmdirs($dir){
    if (!is_dir($dir) || rmdir($dir)) return TRUE;   //如果是文件,或者直接刪除文件夾能成功就直接刪除
    if($dir_handle=opendir($dir)){                   //如果是文件夾,要去打開它的資源句柄
        while($filename=readdir($dir_handle)){         //讀取文件夾下的東西
            if($filename!='.' && $filename!='..'){
                $subFile=$dir.'/'.$filename;         //拼接文件名路徑
            }
            is_dir($subFile)?rmdirs($subFile):unlink($subFile);    //如果是文件就繼續遞歸判斷,如果是普通文件就刪除
        }
        closedir($dir_handle);
        return rmdir($dir);
    }
}

rmdirs(__DIR__.'/hello/777');

3.對文件的操作

//讀取本地文件
$filename=__DIR__.'/www5.php';
$content=file_get_contents($filename);
$filename="https://www.runoob.com/php/php-file.html";  //遠程讀取 需要配置php.ini 遠程url open
$content=file_get_contents($filename);
echo ($content);

寫入內容

//寫入內容  路徑加內容,這樣會覆蓋,文件不存在會創建
file_put_contents($filename,"<?php echo '123'; ");
//FILE_APPEND 追加內容到末尾
file_put_contents($filename,"<?php echo '123'; ",FILE_APPEND);

打開文件

3.1 文件的權限屬性

模式 描述
r 只讀。在文件的開頭開始。
r+ 讀/寫。在文件的開頭開始。
w 只寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
w+ 讀/寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
a 追加。打開並向文件末尾進行寫操作,如果文件不存在,則創建新文件。
a+ 讀/追加。通過向文件末尾寫內容,來保持文件內容。
x 只寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。
x+ 讀/寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。
//只讀打開文件
fopen($filename,'r'); //後面這個參數你可以參考文權限屬性
//以讀寫方式打開文件
$open=fopen($filename,'r+');
var_dump(fread($open,"3"));
fwrite($open,"寫在哪裏了");   //會覆蓋,如果讀取了長度再寫,就只會覆蓋後面沒有讀取的內容
fclose($open);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章