PHP 檔案系統

在本教程中,你將學習如何使用 PHP 的檔案系統函式動態建立,訪問(或讀取)和操作檔案。

在 PHP 中使用檔案

由於 PHP 是伺服器端程式語言,因此它允許你使用儲存在 Web 伺服器上的檔案和目錄。在本教程中,你將學習如何使用 PHP 檔案系統函式在 Web 伺服器上建立,訪問和操作檔案。

使用 PHP fopen() 函式開啟檔案

要使用檔案,首先需要開啟檔案。PHP fopen() 函式用於開啟檔案。該函式的基本語法如下:

fopen(filename , mode) 

fopen() 傳遞的第一個引數指定要開啟的檔名稱,第二個引數指定應在哪種模式下開啟檔案。例如:

<?php
$handle = fopen("data.txt", "r");
?>

可以使用以下模式之一開啟檔案:

模式 解釋
r 開啟檔案以供讀取。
r+ 開啟檔案進行讀寫。
w 開啟檔案僅寫入並清除檔案內容。如果該檔案不存在,PHP 將嘗試建立它。
w+ 開啟檔案進行讀寫,清除檔案內容。如果該檔案不存在,PHP 將嘗試建立它。
a 附加。開啟檔案僅供寫入。通過寫入檔案末尾來保留檔案內容。如果該檔案不存在,PHP 將嘗試建立它。
a+ 讀/追加。開啟檔案進行讀寫。通過寫入檔案末尾來保留檔案內容。如果該檔案不存在,PHP 將嘗試建立它。
x 開啟檔案僅供寫入。如果檔案已存在,則返回 FALSE 並生成錯誤。如果該檔案不存在,PHP 將嘗試建立它。
x+ 開啟檔案進行讀寫; 否則它與 x 具有相同的行為。

如果你嘗試開啟不存在的檔案,PHP 將生成警告訊息。因此,為了避免這些錯誤訊息,你應該始終使用 PHP file_exists() 函式在嘗試訪問檔案或目錄之前檢查檔案或目錄是否存在。

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to open the file
    $handle = fopen($file, "r");
} else{
    echo "ERROR: File does not exist.";
}
?>

提示: 檔案和目錄的操作容易出錯。因此,實現某種形式的錯誤檢查是一種很好的做法,這樣如果發生錯誤,你的指令碼將優雅地處理錯誤。請參閱有關 PHP 錯誤處理 的教程。

使用 PHP fclose() 函式關閉檔案

完成檔案處理後,需要關閉它。 fclose() 函式用於關閉檔案,如以下示例所示:

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    /* Some code to be executed */
        
    // Closing the file handle
    fclose($handle);
} else{
    echo "ERROR: File does not exist.";
}
?>

注意: 儘管 PHP 在指令碼終止時會自動關閉所有開啟的檔案,但在執行所有操作後關閉檔案是一種很好的習慣。

使用 PHP fread() 函式從檔案中讀取

現在你已經瞭解瞭如何開啟和關閉檔案。在下一節中,你將學習如何從檔案中讀取資料。PHP 有幾個用於從檔案中讀取資料的函式。只需一次操作,你就可以從一個字元讀取整個檔案。

讀取固定數量的字元

fread() 函式可用於從檔案中讀取指定數量的字元。此函式的基本語法如下,

fread(file handle , length in bytes) 

此函式有兩個引數 - 檔案控制代碼和要讀取的位元組數。以下示例從包含空格的 data.txt 檔案中讀取 20 個位元組。讓我們假設檔案 data.txt 包含一段文字 The quick brown fox jumps over the lazy dog.

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // Read fixed number of bytes from the file
    $content = fread($handle, "20");
        
    // Closing the file handle
    fclose($handle);
        
    // Display the file content 
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子將產生以下輸出:

The quick brown fox jumps over the lazy dog.

讀取檔案的全部內容

fread() 函式可與 filesize() 函式結合使用,以立即讀取整個檔案。該 filesize() 函式以位元組為單位返回檔案的大小。

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Open the file for reading
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
        
    // Reading the entire file
    $content = fread($handle, filesize($file));
        
    // Closing the file handle
    fclose($handle);
        
    // Display the file content
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子將產生以下輸出:

The quick brown fox jumps over the lazy dog.

在 PHP 中讀取檔案的全部內容的最簡單方法是使用該 readfile() 函式。此函式允許你讀取檔案的內容而無需開啟它。以下示例將生成與上例相同的輸出:

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Reads and outputs the entire file
    readfile($file) or die("ERROR: Cannot open the file.");
} else{
    echo "ERROR: File does not exist.";
}
?>

上面的例子將產生以下輸出:

The quick brown fox jumps over the lazy dog.

讀取檔案的全部內容而不需要開啟它的另一種方法是使用該 file_get_contents() 函式。此函式接受檔案的名稱和路徑,並將整個檔案讀入字串變數。這是一個例子:

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Reading the entire file into a string
    $content = file_get_contents($file) or die("ERROR: Cannot open the file.");
        
    // Display the file content 
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

另一種從檔案中讀取整個資料的方法是 PHP 的 file() 函式。它的函式類似 file_get_contents() ,但它將檔案內容作為一個行陣列返回,而不是單個字串。返回陣列的每個元素對應於檔案中的一行。

要處理檔案資料,你需要使用 foreach 迴圈 遍歷陣列。這是一個示例,它將檔案讀入陣列,然後使用迴圈顯示它:

<?php
$file = "data.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Reading the entire file into an array
    $arr = file($file) or die("ERROR: Cannot open the file.");
    foreach($arr as $line){
        echo $line;
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

使用 PHP fwrite() 函式寫入檔案

同樣,你可以使用 PHP fwrite() 函式將資料寫入檔案或附加到現有檔案。該函式的基本語法如下:

fwrite(file handle , string) 

fwrite() 函式有兩個引數 - file handle 和要寫入的資料字串 string,如以下示例所示:

<?php
$file = "note.txt";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Open the file for writing
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
    
// Write data to the file
fwrite($handle, $data) or die ("ERROR: Cannot write the file.");
    
// Closing the file handle
fclose($handle);
    
echo "Data written to the file successfully.";
?>

在上面的例子中,如果 note.txt 檔案不存在,PHP 將自動建立它並寫入資料。但是,如果 note.txt 檔案已經存在,PHP 將在寫入新資料之前刪除此檔案的內容(如果有),但是如果你只想附加檔案並保留現有內容,則只需在上面的例子中使用模式 a 而不是 w

另一種方法是使用 file_put_contents() 函式。它是 file_get_contents() 函式的對應函式,提供了一種將資料寫入檔案而不需要開啟它的簡單方法。此函式接受檔案的名稱和路徑以及要寫入檔案的資料。這是一個例子:

<?php
$file = "note.txt";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Write data to the file
file_put_contents($file, $data) or die("ERROR: Cannot write the file.");
    
echo "Data written to the file successfully.";
?>

如果 file_put_contents() 函式中指定的檔案已存在,PHP 將預設覆蓋它。如果要保留檔案的內容,可以將特殊 FILE_APPEND 標誌作為第三個引數傳遞給 file_put_contents() 函式。它只是將新資料附加到檔案而不是重寫它。這是一個例子:

<?php
$file = "note.txt";
    
// String of data to be written
$data = "The quick brown fox jumps over the lazy dog.";
    
// Write data to the file
file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file.");
    
echo "Data written to the file successfully.";
?>

使用 PHP rename() 函式重新命名檔案

你可以使用 PHP 的 rename() 函式重新命名檔案或目錄,如下所示:

<?php
$file = "file.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to rename the file
    if(rename($file, "newfile.txt")){
        echo "File renamed successfully.";
    } else{
        echo "ERROR: File cannot be renamed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

你可以使用 PHP 的 unlink() 函式刪除檔案或目錄,如下所示:

<?php
$file = "note.txt";
 
// Check the existence of file
if(file_exists($file)){
    // Attempt to delete the file
    if(unlink($file)){
        echo "File removed successfully.";
    } else{
        echo "ERROR: File cannot be removed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

在下一章中,我們將瞭解有關在 PHP 中解析目錄或資料夾的更多資訊。

PHP 檔案系統函式

下表提供了一些其他有用的 PHP 檔案系統函式的概述,這些函式可用於動態讀取和寫入檔案。

函式 描述
fgetc() 一次讀取一個字元。
fgets() 一次讀取一行。
fgetcsv() 讀取一行以逗號分隔的值。
filetype() 返回檔案的型別。
feof() 檢查是否已到達檔案末尾。
is_file() 檢查檔案是否是常規檔案。
is_dir() 檢查檔案是否是目錄。
is_executable() 檢查檔案是否可執行。
realpath() 返回規範化的絕對路徑名。
rmdir() 刪除一個空目錄。