許多開發者只知道 rename() 能重新命名檔案,實則它相當於 Unix mv 指令,能同時完成「移動路徑」與「重新命名」,且跨平台 (Win32/Unix) 皆支援。
$oldpath = '/var/www/html/old_name.txt';
$newpath = '/home/user/docs/new_name.txt';
rename($oldpath, $newpath); // 同時移動目錄並改名
若 $newpath 為現有目錄,PHP 會嘗試將來源移動到該目錄下 (保留原檔名),行為與 mv 一致。
rename() 同樣適用於目錄:
rename('/var/www/project_v1', '/var/www/project_v2'); // 整個目錄改名/移動
目錄下所有檔案、子目錄會一併移動,極為高效 (通常為檔案系統層面操作,非逐檔複製)。
作者提到 PHP4 Win32 版似乎移除 unlink() (實為誤解,實際存在),但提供一個有趣思路:將檔案移動到暫存目錄 (/tmp 或 C:\Windows\Temp) 達到「軟刪除」效果:
$path = 'C:\web\upload\bad_file.php';
$tmp = 'C:\Windows\Temp';
rename($path, $tmp . '\' . basename($path)); // 移至暫存區
// 稍後由排程任務清理暫存區
優點:避免權限問題導致 unlink() 失敗;可實現「回收筒」機制。
缺點:跨磁碟分區移動會退化為「複製+刪除」,效能下降;需確保暫存目錄可寫入。
rename() 會覆蓋 (Unix) 或失敗 (Windows, PHP < 5.3.1),建議先 file_exists() 檢查。rename() 是檔案系統操作的瑞士刀,善用它能簡化移動、重命名、批次整理甚至軟刪除邏輯。現代 PHP 配合 FilesystemIterator 與 SplFileInfo 可構建更強大的檔案管理工具。