文件系統操作是 PHP 後端開發的高頻需求。本文系統整理核心函數用法、參數詳解、返回值判斷與最佳實踐代碼片段,幫你快速查閱並避開常見坑點。
bool copy(string $source, string $dest [, resource $context])
$source = './1.txt';
$dest = './2.txt';
if (copy($source, $dest)) {
echo '複製成功';
} else {
echo '複製失敗:' . error_get_last()['message'];
}
bool rename(string $oldname, string $newname [, resource $context])
copy() + unlink() 替代bool unlink(string $filename [, resource $context])
rmdir()is_file() 判斷,避免 Warningbool mkdir(string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]])
true 遞歸創建多級目錄(PHP 5.0.0+)bool rmdir(string $dirname [, resource $context])
array scandir(string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context]])
. 和 .. 的文件名數組$sorting_order:SCANDIR_SORT_DESCENDING 降序,SCANDIR_SORT_NONE 不排序DirectoryIterator 流式處理function deleteDirRecursive(string $dir): bool {
if (!is_dir($dir)) return false;
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($items as $item) {
$item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname());
}
return rmdir($dir);
}
function copyDirRecursive(string $src, string $dst): bool {
if (!is_dir($src)) return false;
if (!is_dir($dst)) mkdir($dst, 0755, true);
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($src, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iter as $item) {
$target = $dst . DIRECTORY_SEPARATOR . $iter->getSubPathname();
$item->isDir() ? mkdir($target) : copy($item->getPathname(), $target);
}
return true;
}
| 操作 | 陷阱 | 對策 |
|---|---|---|
| copy() | 目標目錄不存在失敗 | 先 mkdir(dirname($dest), 0755, true) |
| rename() | 跨分區/磁盤失敗 | copy()+unlink() 組合 |
| mkdir() | Windows 權限參數無效 | 忽略 $mode,依賴 ACL |
| rmdir() | 非空目錄報錯 | 遞歸清空後再刪 |
| scandir() | 包含 . 和 .. | 遍歷時跳過或 array_diff() |
掌握 copy/rename/unlink/mkdir/rmdir/scandir 核心六函數,配合 RecursiveDirectoryIterator 處理遞歸場景,即可覆蓋 95% 文件系統操作需求。記住:操作前判斷、操作後驗證、失敗記錄日誌,是生產級代碼的基本素養。