Getting Started with PHP Filesystem

PHP:8.0

跟所有的程式語言相同,PHP 也提供了許多操作檔案的 functions。

Opening a File with fopen()

操作檔案的第一步驟,就是開啟檔案了,可以使用 fopen() 來開啟檔案。另外在開啟檔案的同時,也可以使用 file_exists() 判斷檔案是否存在。

fopen() 的使用需要傳入 檔案名稱模式 即可使用。

fopen(filename, mode)
fopen 的模式種類
Modes Name Description
r Read 開啟檔案,以供讀取,從檔案開頭開始
r+ Read 開啟檔案,以供讀取及寫入,從檔案開頭開始
w Write 開啟檔案,並寫入(覆寫)
w+ Write 開啟檔案,以供讀取及寫入(覆寫)
a Append 開啟檔案,以供新增內容,接續在目前已有的內容之後開始寫入,假如檔案不存在,會建立一個新檔。
a+ Append 開啟檔案,以供新增及讀取內容,接續在目前已有的內容之後開始寫入,假如檔案不存在,會建立一個新檔。
x Cautious write 開啟檔案並寫入,假如檔案已存在,不會開啟開檔,fopen()會回傳false。

範例

$file = 'data.txt';

// Check the existence of file
if (file_exists($file)) {
    // Attempt to open the file
    $fileHandle = fopen($file, 'r');
} else{
    echo 'File does not exist.' . PHP_EOL;
}

Closing a File with fclose()

在完成檔案操作後,需要配合 fclose() 來關閉檔案,釋放相關的資源。

範例

$file = 'data.txt';

// Check the existence of file
if (file_exists($file)) {
    // Attempt to open the file
    $fileHandle = fopen($file, 'r');

    /* Some code to be executed */

    // Use fclose to release resource
    fclose($fileHandle);
} else{
    echo 'File does not exist.' . PHP_EOL;
}

Reading a File with fread()

在開啟檔案之後,可以透過 fread() 來讀取檔案的內容。

fread() 的使用需要傳入 File Handle讀取長度(bytes)

fread(file handle, length in bytes)

因為 fread() 需要定義讀取長度的關係,可以配合 filesize() 操作,就可以讀取完整檔案。

範例

$file = 'data.txt';

// Check the existence of file
if (file_exists($file)) {
    // Attempt to open the file
    $fileHandle = fopen($file, 'r');

    // Reading file
    $content = fread($fileHandle, filesize($file));

    // Use fclose to release resource
    fclose($fileHandle);

    echo $content;
} else{
    echo 'File does not exist.' . PHP_EOL;
}

Notice: 相同的功能,也有 file_get_contents()readfile() 可以參考使用。

Reading a File by Line with fgets()

上面提到的 fread() 是整個檔案讀取,如果遇到需要逐行處理的狀況,就可以使用 fgets() 搭配 feof() 來逐行讀取來處理。

範例

$file = 'data.txt';

// Check the existence of file
if (file_exists($file)) {
    // Attempt to open the file
    $fileHandle = fopen($file, 'r');

    // Reading file by line
    if ($fileHandle) {
        // Use feof() to check end-of-file poiner
        while (!feof($fileHandle)) {
            // Reading file by line
            echo fgets($fileHandle);
        }
    }

    // Use fclose to release resource
    fclose($fileHandle);
} else{
    echo 'File does not exist.' . PHP_EOL;
}

Notice: 類似的功能,也有 fgetcsv()fgetc() 可以參考使用。

Writing a File with fwrite()

除了讀取,寫入也是檔案操作很重要的一環,fwrite() 就是用來寫入檔案的 function。

fwrite() 的使用需要傳入 File Handle 跟要寫入的 內容

fwrite(file handle, string)

範例

$file = 'note.txt';

$data = 'Hello 你好嗎';

// Writing file
$fileHandle = fopen($file, 'r');
fwrite($fileHandle, $data);

fclose($fileHandle);

echo 'Data written to the file successfully.' . PHP_EOL;

Notice: 相同的功能,也有 file_put_contents() 可以參考使用。

Renaming a File with rename()

透過 rename() 可以修改檔案名稱。

範例

$file = 'note.txt';

if (file_exists($file)) {
    if (rename($file, 'new.txt')) {
        echo 'File renamed successfully.' . PHP_EOL;
    } else {
        echo 'File cannot be renamed.' . PHP_EOL;
    }
}

Removing a File with unlink()

透過 unlink() 可以刪除檔案。

範例

$file = 'note.txt';

if (file_exists($file)) {
    if (unlink($file)) {
        echo 'File removed successfully.' . PHP_EOL;
    } else {
        echo 'File cannot be removed.' . PHP_EOL;
    }
}

Other Filesystem functions

Function Description
filetype() 取得檔案類型
is_file() 判斷是否為檔案
is_dir() 判斷是否為目錄
is_executable() 判斷是否可以執行
realpath() 取得檔案完整路徑
rmdir() 刪除目錄
Categories: PHP