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

PHP 文件系統操作完全指南:判斷、屬性、路徑、讀寫、鎖定、指針控制

     編輯:PHP 相關知識

PHP 文件系統操作完全指南:判斷、屬性、路徑、讀寫、鎖定、指針控制

文件處理是 PHP 核心能力之一。本文系統梳理 is_* 判斷函數、file* 屬性獲取、basename/dirname/pathinfo 路徑解析、創建刪除修改、多種讀寫模式(file_get_contents/fopen)、文件鎖、指針控制 (fseek/ftell/rewind) 等完整知識體系。

1. 基礎判斷函數

函數用途
is_dir是否目錄
is_file是否普通文件
is_readable可讀
is_writable可寫
is_executable可執行
is_link符號鏈接
is_uploaded_fileHTTP POST 上傳文件

2. 文件屬性獲取

$file = 'example.txt';
echo "存在: " . (file_exists($file) ? '是' : '否') . "\n";
echo "大小: " . filesize($file) . " bytes\n";
echo "類型: " . filetype($file) . "\n"; // file/dir/link
echo "修改時間: " . date('Y-m-d H:i:s', filemtime($file)) . "\n";
echo "訪問時間: " . date('Y-m-d H:i:s', fileatime($file)) . "\n";
echo "權限: " . substr(sprintf('%o', fileperms($file)), -4) . "\n"; // 如 0644
echo "所有者 UID: " . fileowner($file) . "\n";
echo "Inode: " . fileinode($file) . "\n";

3. 路徑解析三劍客

$path = "/var/www/html/index.php";
echo basename($path);        // index.php
echo dirname($path);         // /var/www/html
print_r(pathinfo($path));
/* Array
(
    [dirname] => /var/www/html
    [basename] => index.php
    [extension] => php
    [filename] => index
) */

4. 創建、刪除、重命名、複製、權限

touch('new.txt');           // 創建空文件/更新時間
unlink('old.txt');          // 刪除文件
rename('a.txt', 'b.txt');   // 重命名/移動
copy('src.txt', 'dst.txt'); // 複製
chmod('script.sh', 0755);   // 設置權限 (八進制)

5. 讀寫模式全景

模式說明指針位置文件不存在文件存在
r只讀開頭失敗保留內容
r+讀寫開頭失敗保留內容,覆蓋寫入
w只寫開頭創建**清空**內容
w+讀寫開頭創建**清空**內容
a只寫(追加)結尾創建保留,追加寫入
a+讀寫(追加)結尾創建保留,追加寫入
b二進制模式 (Windows 必需)配合上述字母使用,如 rb wb
t文本模式 (Windows 換行轉換)配合使用,如 rt

6. 核心讀寫函數

  • file_get_contents($file):一次性讀全文,適合小文件/遠程 URL。
  • file_put_contents($file, $data, FILE_APPEND):一次性寫入,FILE_APPEND 追加模式。
  • file($file):按行讀入數組,含換行符。
  • fopen/fread/fwrite/fgets/fgetc:流式控制,適合大文件/精確指針操作。

7. 指針控制

$fp = fopen('data.bin', 'rb');
echo ftell($fp);           // 0
fread($fp, 10);            // 讀 10 字節
echo ftell($fp);           // 10
fseek($fp, 20, SEEK_CUR);  // 相對當前 +20
fseek($fp, -10, SEEK_END); // 相對文件末尾 -10
rewind($fp);               // 回到開頭
fclose($fp);

8. 文件鎖 (flock)

$fp = fopen('counter.txt', 'c+'); // 打開/創建,指針在開頭
if (flock($fp, LOCK_EX)) {        // 獨占鎖
    $count = (int)fread($fp, 100) + 1;
    ftruncate($fp, 0);            // 清空
    rewind($fp);
    fwrite($fp, $count);
    flock($fp, LOCK_UN);          // 釋放鎖
}
fclose($fp);

最佳實踐清單

  • 大文件**必須**使用流式 fopen/fread,禁用 file_get_contents。
  • 併發寫入**必須** flock,或遷移至 Redis/數據庫原子操作。
  • 路徑拼接使用 DIRECTORY_SEPARATOR 或統一正斜杠 /。
  • 上傳文件驗證:is_uploaded_file + move_uploaded_file + MIME/副檔名白名單。
  • 臨時文件使用 sys_get_temp_dir() + tempnam(),定期清理。

文件系統 API 看似基礎,實則是構建緩存、日誌、上傳、導出、ETL 等核心功能的基石,值得深度掌握。

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