文件系統操作是 PHP 開發中高頻需求:上傳處理、快取管理、日誌記錄、備份還原等場景都離不開文件與目錄操作。本文提供一個功能完整的 file_dir 類別,涵蓋目錄建立、遞歸刪除、複製、大小計算、文件讀寫等核心功能,適合直接整合至專案中使用。
function check_exist($filename) {
return file_exists($filename);
}
function create_dir($dirname, $mode = 0777) {
if (is_null($dirname) || $dirname === "") return false;
if (!is_dir($dirname)) {
return mkdir($dirname, $mode);
}
}
解決 mkdir 單層限制,支援一次建立完整路徑:
function createDir($aimUrl) {
$aimUrl = str_replace('\\', '/', $aimUrl);
$aimDir = '';
$arr = explode('/', $aimUrl);
foreach ($arr as $str) {
$aimDir .= $str . '/';
if (!file_exists($aimDir)) {
mkdir($aimDir);
}
}
}
function delete_dir($dirname) {
if ($this->check_exist($dirname) && is_dir($dirname)) {
if (!$dirhandle = opendir($dirname)) return false;
while (($file = readdir($dirhandle)) !== false) {
if ($file == "." || $file == "..") continue;
$file = $dirname . DIRECTORY_SEPARATOR . $file;
if (is_dir($file)) {
$this->delete_dir($file); // 遞歸刪除子目錄
} else {
unlink($file); // 刪除文件
}
}
closedir($dirhandle);
return rmdir($dirname);
}
return false;
}
function copy_dir($dirfrom, $dirto) {
if (!is_dir($dirfrom)) return false;
if (!is_dir($dirto)) mkdir($dirto);
$dirhandle = opendir($dirfrom);
if ($dirhandle) {
while (false !== ($file = readdir($dirhandle))) {
if ($file == "." || $file == "..") continue;
$filefrom = $dirfrom . DIRECTORY_SEPARATOR . $file;
$fileto = $dirto . DIRECTORY_SEPARATOR . $file;
if (is_dir($filefrom)) {
$this->copy_dir($filefrom, $fileto);
} else {
if (!file_exists($fileto)) copy($filefrom, $fileto);
}
}
}
closedir($dirhandle);
}
function getdir_size($dirname) {
if (!file_exists($dirname) || !is_dir($dirname)) return false;
$size = 0;
$handle = opendir($dirname);
while (false !== ($file = readdir($handle))) {
if ($file == "." || $file == "..") continue;
$file = $dirname . "/" . $file;
if (is_dir($file)) {
$size += $this->getdir_size($file);
} else {
$size += filesize($file);
}
}
closedir($handle);
return $size;
}
function getReal_size($size) {
$kb = 1024;
$mb = $kb * 1024;
$gb = $mb * 1024;
$tb = $gb * 1024;
if ($size < $kb) return $size . "B";
if ($size >= $kb && $size < $mb) return round($size / $kb, 2) . "KB";
if ($size >= $mb && $size < $gb) return round($size / $mb, 2) . "MB";
if ($size >= $gb && $size < $tb) return round($size / $gb, 2) . "GB";
if ($size >= $tb) return round($size / $tb, 2) . "TB";
}
function input_content($filename, $str) {
if (function_exists('file_put_contents')) {
file_put_contents($filename, $str);
} else {
$fp = fopen($filename, "wb");
fwrite($fp, $str);
fclose($fp);
}
}
function output_content($filename) {
if (function_exists('file_get_contents')) {
return file_get_contents($filename);
} else {
$fp = fopen($filename, "rb");
$str = fread($fp, filesize($filename));
fclose($fp);
return $str;
}
}
function output_to_array($filename) {
$file = file($filename);
$arr = array();
foreach ($file as $value) {
$arr[] = trim($value);
}
return $arr;
}
<?php
$dir = new file_dir();
// 建立多層目錄
$dir->createDir("storage/logs/2024/01");
// 獲取目錄大小並格式化
$size = $dir->getdir_size("storage/uploads");
echo "上傳目錄大小: " . $dir->getReal_size($size);
// 文件備份
$dir->copy_file("config/app.php", "backup/app.php." . date("Ymd"));
// 讀取配置文件到陣列
$configLines = $dir->output_to_array("config/settings.ini");
?>
PHP 5.3+ 可考慮使用 SPL FileInfo 類別,提供更物件導向的介面;大型專案建議使用 Flysystem 等抽象層庫,支援本地、AWS S3、FTP 等多種存儲後端。