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

PHP 常用文件操作函數完整指南

     編輯:PHP 相關知識

PHP 常用文件操作函數完整指南

在 PHP 開發中,文件操作是基礎且核心的技能。無論是處理上傳文件、讀取配置、寫入日誌,還是構建緩存機制,都離不開文件系統的交互。本文系統梳理 PHP 文件操作的核心函數,按功能分類詳細說明,並附帶實用提示,幫助開發者快速查閱與應用。

一、文件類型判斷

確定文件性質是操作的前提。

  • filetype():傳入路徑字符串,返回 file(普通文件)、dir(目錄)或 unknown。
  • is_file() / is_dir():分別判斷是否為文件或目錄,返回布爾值,語義更清晰。

二、文件屬性獲取

以下函數參數均為文件名(含路徑)。

  • file_exists():檢查文件或目錄是否存在。
  • filesize():獲取文件大小(字節),失敗返回 false。
  • is_readable() / is_writable() / is_executable():分別檢查可讀、可寫、可執行權限。
  • filectime() / filemtime() / fileatime():分別獲取創建、修改、訪問時間(Unix 時間戳)。
  • stat():一次性返回包含大小、時間、inode 等屬性的關聯數組。
  • clearstatcache():清除 PHP 內部對文件狀態的緩存,確保多次調用時數據最新。

三、路徑解析與處理

  • basename(path, [suffix]):提取文件名,可選參數 suffix 用於去除擴展名(如 .php)。
  • dirname(path):返回去掉文件名後的目錄部分。
  • pathinfo():返回關聯數組,含 dirname、basename、extension 三鍵,功能最全。

四、目錄遍歷

標準流程:opendir() → readdir() → closedir()。

  • opendir():打開目錄返回句柄,失敗返回 false。
  • readdir():讀取當前指針位置的文件名並後移指針,無更多文件返回 false。
  • closedir():關閉句柄釋放資源。
  • rewinddir():將指針重置到目錄開頭。

提示:PHP 5+ 推薦使用 DirectoryIterator 或 RecursiveDirectoryIterator 進行面向對象遍歷,代碼更簡潔健壯。

五、目錄創建與刪除

  • mkdir():創建目錄,支持遞歸創建(第三參數 true)。
  • rmdir():刪除空目錄。非空目錄需先遞歸刪除內部文件(unlink())和子目錄。

六、目錄複製與移動

PHP 無內置單函數實現,需組合操作:

  1. 複製:mkdir() 創建目標目錄 → 遍歷源目錄 → copy() 逐個文件複製。
  2. 移動:複製完成後,遞歸刪除源目錄(文件用 unlink(),目錄用 rmdir())。

七、文件打開與關閉

fopen(filename, mode, [use_include_path, [zcontext]]) 返回文件指針資源,失敗返回 false。

常用模式速查:

模式說明
r只讀,指針在開頭
r+讀寫,指針在開頭
w只寫,截斷文件或創建新文件
w+讀寫,同 w
a寫入,指針在末尾,創建新文件
a+讀寫,同 a
x寫入,文件存在則失敗(僅本地)
b / t二進制 / 文本模式(Windows 區分換行符時需加 b)

fclose():關閉文件指針,寫入模式下會刷新緩衝區。

八、文件內容讀寫

  • fwrite(handle, string, [length]):寫入字符串,返回寫入字節數。換行符用 \n 或 \r\n。
  • fread(handle, length):讀取指定長度字節。
  • file_get_contents():一次性讀取整文件為字符串,簡潔高效。
  • fgets(handle, [length]):讀取一行(含換行符)。
  • fgetc():讀取單字符。
  • file():將文件按行讀入數組,每行為一元素。
  • readfile():直接輸出文件到輸出緩衝,適合大文件下載不佔內存。
  • feof():判斷是否到達 EOF。

遠程文件訪問:需在 php.ini 啟用 allow_url_fopen=On,並配合 set_time_limit() 防止超時。

九、文件指針控制

  • ftell():返回當前指針位置(字節偏移)。
  • fseek(handle, offset, [whence]):移動指針。whence 可為 SEEK_SET(默認,從開頭)、SEEK_CUR(當前位置)、SEEK_END(從末尾,offset 需為負值)。注意:a/a+ 模式下寫入總在末尾,fseek 無效。
  • rewind():指針移至文件開頭(等同 fseek($fp, 0))。

十、文件鎖定(併發控制)

flock(handle, operation, [&wouldblock]) 防止多進程同時讀寫導致數據錯亂。

  • LOCK_SH:共享鎖(讀取用)。
  • LOCK_EX:獨占鎖(寫入用)。
  • LOCK_UN:釋放鎖。
  • LOCK_NB:非阻塞模式(配合上述標誌用位或運算)。

第三參數若傳 1,鎖定期間阻塞其他進程。

十一、文件複製、刪除、重命名、截斷

  • copy(src, dest):複製文件,返布爾值。
  • unlink(file):刪除文件。
  • ftruncate(handle, size):截斷文件到指定長度。
  • rename(old, new):重命名文件或目錄(跨分區可能失敗)。

十二、文件上傳與下載

上傳核心:$_FILES 超全局數組

鍵名含義
name原始文件名(含擴展名)
size文件大小(字節)
tmp_name服務器臨時存儲路徑
error錯誤碼:0成功、1超過 upload_max_filesize、2超過表單 MAX_FILE_SIZE、3部分上傳、4無文件
typeMIME 類型(瀏覽器提供,不可完全信任)

關鍵函數

  • is_uploaded_file():驗證文件是否通過 HTTP POST 上傳(防偽造)。
  • move_uploaded_file():將臨時文件移動到目標位置(會自動檢查是否為上傳文件)。

下載響應頭示例

<?php
header('Content-Type: image/gif');
header('Content-Disposition: attachment; filename="test.gif"');
header('Content-Length: 3390');
readfile('test.gif');
?>

實際項目中建議封裝為工具類,統一處理大文件分塊輸出、斷點續傳、安全校驗等邏輯。

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