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

PHP 文件與目錄操作完全手冊:複製、移動、重命名、刪除、創建、遍歷實戰函數詳解

     編輯:PHP 相關知識

PHP 文件與目錄操作完全手冊:複製、移動、重命名、刪除、創建、遍歷實戰函數詳解

文件系統操作是 PHP 後端開發的高頻需求。本文系統整理核心函數用法、參數詳解、返回值判斷與最佳實踐代碼片段,幫你快速查閱並避開常見坑點。

1. 文件複製:copy()

bool copy(string $source, string $dest [, resource $context])
  • $source:源文件路徑(相對/絕對均可)
  • $dest:目標文件完整路徑(含文件名)
  • 返回:成功 true,失敗 false(權限不足、源文件不存在、磁盤滿等)
  • 注意:目標文件存在將被靜默覆蓋,不會報錯
$source = './1.txt';
$dest   = './2.txt';
if (copy($source, $dest)) {
    echo '複製成功';
} else {
    echo '複製失敗:' . error_get_last()['message'];
}

2. 文件移動/重命名:rename()

bool rename(string $oldname, string $newname [, resource $context])
  • 同目錄下改名 → 重命名
  • 跨目錄移動 → 移動(需目標目錄存在且可寫)
  • 跨文件系統移動可能失敗(Windows 下常見),建議 copy() + unlink() 替代

3. 文件刪除:unlink()

bool unlink(string $filename [, resource $context])
  • 僅能刪除文件,目錄請用 rmdir()
  • 刪除前建議 is_file() 判斷,避免 Warning
  • 文件被進程佔用時(Windows)刪除會失敗

4. 目錄創建:mkdir()

bool mkdir(string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]])
  • $mode:八進制權限(如 0755),Windows 下無效(忽略)
  • $recursive:true 遞歸創建多級目錄(PHP 5.0.0+)
  • 返回 true/false,失敗常因父目錄不可寫或路徑包含非法字符

5. 目錄刪除:rmdir()

bool rmdir(string $dirname [, resource $context])
  • 前提:目錄必須為空目錄(無文件、無子目錄)
  • 非空目錄需先遞歸刪除內容,再刪除目錄本身

6. 目錄遍歷:scandir()

array scandir(string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context]])
  • 返回包含 . 和 .. 的文件名數組
  • $sorting_order:SCANDIR_SORT_DESCENDING 降序,SCANDIR_SORT_NONE 不排序
  • 大目錄慎用(全量載入內存),可考慮 DirectoryIterator 流式處理

7. 實戰封裝:遞歸刪除非空目錄

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

8. 實戰封裝:遞歸複製目錄樹

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% 文件系統操作需求。記住:操作前判斷、操作後驗證、失敗記錄日誌,是生產級代碼的基本素養。

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