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);釋放內存,
//返回類型: 資源 目錄句柄
$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);