首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 文件與目錄操作工具類完整實作指南

     編輯:PHP 綜合知識

前言

文件系統操作是 PHP 開發中高頻需求:上傳處理、快取管理、日誌記錄、備份還原等場景都離不開文件與目錄操作。本文提供一個功能完整的 file_dir 類別,涵蓋目錄建立、遞歸刪除、複製、大小計算、文件讀寫等核心功能,適合直接整合至專案中使用。

類別核心功能

1. 存在性檢查與基本目錄操作

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);
    }
}

2. 多層級目錄建立(支援遞歸)

解決 mkdir 單層限制,支援一次建立完整路徑:

function createDir($aimUrl) {
    $aimUrl = str_replace('\\', '/', $aimUrl);
    $aimDir = '';
    $arr = explode('/', $aimUrl);
    foreach ($arr as $str) {
        $aimDir .= $str . '/';
        if (!file_exists($aimDir)) {
            mkdir($aimDir);
        }
    }
}

3. 遞歸刪除目錄與內容

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;
}

4. 目錄複製與大小計算

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;
}

5. 人性化文件大小格式化

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";
}

6. 文件讀寫與內容處理

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");
?>

最佳實踐建議

  1. 權限控制:生產環境中避免使用 0777 權限,建議 0755
  2. 路徑安全:對用戶輸入路徑進行驗證,防止目錄遍歷攻擊
  3. 大文件處理:大文件讀寫建議使用流式處理避免記憶體溢出
  4. 錯誤處理:生產代碼中應加入 try-catch 與詳細日誌記錄

現代化替代方案

PHP 5.3+ 可考慮使用 SPL FileInfo 類別,提供更物件導向的介面;大型專案建議使用 Flysystem 等抽象層庫,支援本地、AWS S3、FTP 等多種存儲後端。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved