IO 類繼承自基類 SnkClass,核心職責是將底層文件系統操作(讀寫、複製、移動、刪除、搜尋、屬性獲取)封裝為統一、可復用、帶錯誤碼回饋的介面。關鍵屬性:
$result:操作結果數組,成功時攜帶數據$buffer_size:讀寫緩衝區大小(默認 8KB),平衡內存與 I/O 次數$exist_dir:複製/移動目錄時記錄目標路徑中已存在的最深層級,解決「目標為源子目錄」的遞歸死循環問題list_dir()返回結構化數組:[['name'=>..., 'location'=>絕對路徑, 'type'=>0目錄/1文件/-1其他], ...]。關鍵細節:
realpath() 規範化路徑,補齊目錄分隔符!== FALSE 嚴格判斷 readdir() 返回值,避免文件名為 0 時誤判. 和 .. 特殊項目clearstatcache() 清除文件狀態緩存,確保後續操作獲取最新屬性file_info()返回包含名稱、路徑、類型、大小、訪問/修改/狀態變更時間、可讀/可寫權限的關聯數組。同樣依賴 realpath() 和 clearstatcache()。
seek_file()支援正則模式、類型過濾(文件/目錄/全部)、子目錄深度限制、結果數量上限。演算法亮點:
0x000Barray_merge() 合併$seek_type + $item['type'] == 1 精妙實現「僅文件/僅目錄/全部」三態判斷$limit 立即 break 並 array_splice() 截斷,避免資源浪費delete()文件直接 unlink(),目錄遞歸清空後 rmdir()。任一子項失敗即整體回滾返回 FALSE,保證原子性。
generate_path()處理相對/絕對路徑、跨平台分隔符、.. 回溯、非法字符過濾。核心流程:
DIRECTORY_SEPARATORrealpath() 解析基礎路徑(不存在則退回當前工作目錄).. 彈棧、. 忽略、普通段入棧make_dir()基於 generate_path() 分解路徑層級,逐級 mkdir()。記錄 $exist_dir 供上層複製/移動操作判斷目標是否為源子目錄。
verify_file()三層校驗:存在性 → 大小一致 →(可選)MD5 雜湊比對。超過 1GB 文件可跳過 MD5 以節省 CPU,僅比對大小。
copy() / move()共用遞歸框架,差異在於移動最後需刪除源文件/目錄。關鍵機制:
$sub 區分外部調用(FALSE,重置 $exist_dir)與內部遞歸(TRUE,保持 $exist_dir)$src == $this->exist_dir 觸發提前返回,打破遞歸循環verify_file(),失敗則刪除目標文件並報錯unlink($src),目錄遞歸完成後 rmdir($src)(非共用父目錄情況)no_comment()有限狀態機(FSM)逐字符解析,狀態包括:雙引號字符串、單引號字符串、行註釋(//)、塊註釋(/* */)、轉義字符。流程:
flock(LOCK_EX) 獨佔鎖,防止併發損壞十六進制錯誤碼(0x0001~0x000D)覆蓋目錄/文件不存在、權限不足、參數錯誤、磁盤空間不足、鎖定失敗等場景,統一由基類 error_occur() 處理,便於上層統一捕獲、記錄、轉換為用戶友好提示。
| 原版特性 | 現代 PHP 改造方向 |
|---|---|
| 自定義錯誤碼 + 基類處理 | 拋出具體異常類(FileNotFoundException、PermissionDeniedException),配合 try-catch 與全局異常處理器 |
引用傳遞 &$array 返回結果 | 直接返回值,利用 PHP 7+ 引用計數優化,代碼更直觀 |
手動 clearstatcache() | 封裝為私有方法 clearStatCache(),在讀取屬性前自動調用 |
| 緩衝區手動管理 | 大文件操作改用 SplFileObject 或流(fopen('php://temp')) |
| 正則處理路徑 | 優先使用 pathinfo()、basename()、dirname() 內建函數 |
| 編碼假設為系統默認 | 強制 UTF-8,路徑經 mb_convert_encoding() 處理中文目錄 |