PHP 資料夾操作 複製 刪除 檢視大小 遞迴實現

2022-03-16 19:57:58 字數 1857 閱讀 4715

php雖然提供了 filesize、copy、unlink 等檔案操作的函式,但是沒有提供 dirsize、copydir、rmdirs 等資料夾操作的函式(rmdir也只能刪除空目錄)。所以只能手動編寫這些函式,主要的技巧是通過遞迴將問題逐層分解,直到分解成可以直接解決的最小子問題。

********************檢視資料夾大小********************=

由於資料夾是沒有大小的,平常所說的資料夾尺寸準確的說應該是資料夾中所有檔案的總大小。所以只需要將資料夾逐層查詢,統計每一層所包含的檔案大小,最後將結果從最深的資料夾返回合併。

/*

* * 資料夾大小

* @param $path

* @return int */

function dirsize($path

)

closedir($handle

);

return

$size

;}

********************=複製資料夾=********************=

檔案是可以複製的,資料夾是不能複製的(但可以建立),如果要達到複製資料夾的效果,就需要生成乙個和原始資料夾相同目錄結構的新資料夾,然後將檔案按照原目錄結構複製到新資料夾。按照遞迴的思想,不用一開始就生成完整的目錄結構,只需要遍歷當前目錄,發現資料夾不存在再建立即可,然後再將檔案複製到對應的資料夾。

/*

* * 複製資料夾

* @param $source

* @param $dest */

function copydir($source, $dest

)

closedir($handle

);}

********************=刪除資料夾=********************=

rmdir 只能刪除空資料夾,而 unlink 可以刪除檔案。於是刪除資料夾的思路就有了,先通過 unlink 刪除目錄下的所有檔案,再通過 rmdir 刪除剩下的空資料夾。使用遞迴處理的邏輯是,找到當前目錄下所有檔案和資料夾,刪除其中的所有檔案,再遍歷下一層目錄刪除所有檔案……直至最後一層目錄,此時整個資料夾已經沒有檔案了(但是資料夾還在),此時遞迴開始返回,每向上返回一層就刪除這一層的所有空目錄,當返回到最頂層的時候,遞迴就結束了,同時所有的檔案和目錄也都刪除了。

/*

* * 刪除資料夾

* @param $path

* @return bool */

function rmdirs($path

)

closedir($handle

);

return

rmdir($path

);}

********************=剪下資料夾=********************=

rename 是 php filesystem 函式中的乙個特例,它既可以重新命名檔案,也可以重新命名資料夾。如果你為重命名檔案傳入不同的路徑,它又成了剪下函式,堪稱檔案函式中小而美的典範。

/*

* * @param $oldname 必需。規定要重新命名的檔案或目錄。

* @param $newname 必需。規定檔案或目錄的新名稱。

* @param $context 可選。規定檔案控制代碼的環境。 */

rename($oldname,$newname,$context);

PHP 資料夾操作 複製 刪除 檢視大小 迭代實現

既然遞迴能很好的解決,為什麼還要用迭代呢 主要的原因還是效率問題 遞迴的概念是函式呼叫自身,把乙個複雜的問題分解成與其相似的多個子問題來解決,可以極大的減少 量,使得程式看起來非常優雅。由於系統要為每次函式呼叫分配執行空間,並使用壓棧予以記錄。在函式呼叫結束後,系統需要釋放空間,並彈棧恢復斷點。所以...

php檔案及資料夾操作(建立 刪除 移動 複製)

建立fileutil.php檔案,內容及呼叫方式如下 操縱檔案類 例子 fileutil createdir a 1 2 3 測試建立資料夾 建乙個a 1 2 3資料夾 fileutil createfile b 1 2 3 測試建立檔案 在b 1 2 資料夾下面建乙個3檔案 fileutil cr...

python 遞迴刪除資料夾 遞迴複製資料夾

學過python os模組的人都知道python中的rmdir 函式只能刪除乙個空的資料夾,而remove 函式也只能刪除單個的檔案,沒有乙個現成的方法來刪除乙個資料夾 裡面有檔案 所以我們要借助遞迴去刪除乙個資料夾中的每乙個檔案 或者資料夾 下面是 遞迴刪除資料夾 import os defdel...