본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

การจัดการไฟล์: fopen, fread, fwrite, fclose

บทความนี้ได้อธิบายวิธีการจัดการไฟล์ใน PHP โดยใช้ฟังก์ชัน `fopen()`, `fread()`, `fwrite()` และ `fclose()` ซึ่งครอบคลุมการเปิด, อ่าน, เขียน และปิดไฟล์ รวมถึงโหมดต...

การจัดการไฟล์: fopen, fread, fwrite, fclose

ในบทเรียนนี้ เราจะมาเรียนรู้วิธีการจัดการไฟล์ใน PHP ซึ่งเป็นทักษะที่สำคัญสำหรับการสร้างแอปพลิเคชันที่สามารถอ่านและเขียนข้อมูลลงในไฟล์ได้ เราจะครอบคลุมฟังก์ชันพื้นฐานที่ใช้ในการเปิด, อ่าน, เขียน, และปิดไฟล์: fopen(), fread(), fwrite(), และ fclose()

การเปิดไฟล์ด้วย fopen()

ฟังก์ชัน fopen() ใช้สำหรับเปิดไฟล์เพื่อทำการอ่าน, เขียน, หรือทั้งสองอย่าง รูปแบบการใช้งานคือ:

$handle = fopen($filename, $mode);
  • $filename: ชื่อไฟล์ที่ต้องการเปิด (รวมถึง path ถ้าไฟล์ไม่ได้อยู่ใน directory เดียวกัน)
  • $mode: โหมดที่ต้องการเปิดไฟล์ ซึ่งระบุว่าจะอ่าน, เขียน, หรือแก้ไขไฟล์
  • $handle: ตัวแปรที่เก็บ File Handle ซึ่งเป็น Resource ที่ใช้ในการอ้างอิงถึงไฟล์ที่เปิดอยู่

$mode สามารถมีค่าต่างๆ ดังนี้:

  • 'r': เปิดไฟล์เพื่ออ่านอย่างเดียว (read only)
  • 'w': เปิดไฟล์เพื่อเขียนอย่างเดียว (write only) หากไฟล์มีอยู่แล้ว ข้อมูลเก่าจะถูกลบทิ้ง
  • 'a': เปิดไฟล์เพื่อเขียนต่อท้าย (append) หากไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่
  • 'x': สร้างไฟล์ใหม่เพื่อเขียนอย่างเดียว (exclusive create) หากไฟล์มีอยู่แล้ว fopen() จะล้มเหลวและคืนค่า false
  • 'r+': เปิดไฟล์เพื่ออ่านและเขียน
  • 'w+': เปิดไฟล์เพื่ออ่านและเขียน; หากไฟล์มีอยู่แล้ว ข้อมูลเก่าจะถูกลบทิ้ง
  • 'a+': เปิดไฟล์เพื่ออ่านและเขียนต่อท้าย หากไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่
  • 'x+': สร้างไฟล์ใหม่เพื่ออ่านและเขียน; หากไฟล์มีอยู่แล้ว fopen() จะล้มเหลวและคืนค่า false
  • 'b': ใช้สำหรับระบบปฏิบัติการ Windows เพื่อเปิดไฟล์ใน Binary Mode (เช่น 'rb' หรือ 'wb')
  • 't': ใช้สำหรับระบบปฏิบัติการ Windows เพื่อเปิดไฟล์ใน Text Mode (ค่าเริ่มต้น)

ตัวอย่าง: การเปิดไฟล์เพื่ออ่าน

$filename = 'data.txt';
$handle = fopen($filename, 'r');

if ($handle) {
    echo "เปิดไฟล์สำเร็จ!";
} else {
    echo "ไม่สามารถเปิดไฟล์ได้!";
}

ข้อควรระวัง: ควรตรวจสอบว่า fopen() คืนค่า false หรือไม่ เพื่อป้องกันข้อผิดพลาดหากไม่สามารถเปิดไฟล์ได้

การอ่านข้อมูลจากไฟล์ด้วย fread()

เมื่อไฟล์ถูกเปิดแล้ว เราสามารถใช้ฟังก์ชัน fread() เพื่ออ่านข้อมูลจากไฟล์ได้ รูปแบบการใช้งานคือ:

$data = fread($handle, $length);
  • $handle: File Handle ที่ได้จากการเรียก fopen()
  • $length: จำนวน bytes ที่ต้องการอ่าน
  • $data: ข้อมูลที่อ่านได้จากไฟล์

ตัวอย่าง: การอ่านข้อมูลทั้งหมดจากไฟล์

$filename = 'data.txt';
$handle = fopen($filename, 'r');

if ($handle) {
    $filesize = filesize($filename); // หาขนาดไฟล์
    $data = fread($handle, $filesize);
    echo $data;
    fclose($handle); // ปิดไฟล์ทุกครั้งหลังใช้งาน
} else {
    echo "ไม่สามารถเปิดไฟล์ได้!";
}

ข้อควรระวัง: ควรใช้ฟังก์ชัน filesize() เพื่อหาขนาดไฟล์ก่อนอ่าน เพื่อให้แน่ใจว่าเราอ่านข้อมูลทั้งหมดจากไฟล์

การเขียนข้อมูลลงไฟล์ด้วย fwrite()

ฟังก์ชัน fwrite() ใช้สำหรับเขียนข้อมูลลงในไฟล์ รูปแบบการใช้งานคือ:

$bytes_written = fwrite($handle, $data);
  • $handle: File Handle ที่ได้จากการเรียก fopen()
  • $data: ข้อมูลที่ต้องการเขียนลงในไฟล์
  • $bytes_written: จำนวน bytes ที่เขียนลงในไฟล์สำเร็จ

ตัวอย่าง: การเขียนข้อมูลลงในไฟล์

$filename = 'data.txt';
$handle = fopen($filename, 'w'); // เปิดไฟล์ในโหมดเขียน (ข้อมูลเก่าจะถูกลบ)

if ($handle) {
    $data = "Hello, world!\nThis is some new data.";
    $bytes_written = fwrite($handle, $data);

    if ($bytes_written) {
        echo "เขียนข้อมูลสำเร็จ! เขียนไป {$bytes_written} bytes";
    } else {
        echo "เขียนข้อมูลล้มเหลว!";
    }

    fclose($handle);
} else {
    echo "ไม่สามารถเปิดไฟล์ได้!";
}

ข้อควรระวัง: เมื่อเปิดไฟล์ในโหมด 'w' หรือ 'w+' ข้อมูลเก่าในไฟล์จะถูกลบทิ้ง หากต้องการเขียนต่อท้ายไฟล์ ให้ใช้โหมด 'a' หรือ 'a+'

การปิดไฟล์ด้วย fclose()

หลังจากใช้งานไฟล์เสร็จแล้ว เราควรปิดไฟล์ด้วยฟังก์ชัน fclose() เพื่อปล่อย Resource ที่ถูกใช้ไป รูปแบบการใช้งานคือ:

fclose($handle);
  • $handle: File Handle ที่ได้จากการเรียก fopen()

ตัวอย่าง: การปิดไฟล์

$filename = 'data.txt';
$handle = fopen($filename, 'r');

if ($handle) {
    // ... ทำงานกับไฟล์ ...
    fclose($handle);
    echo "ปิดไฟล์แล้ว!";
} else {
    echo "ไม่สามารถเปิดไฟล์ได้!";
}

ข้อควรจำ: การปิดไฟล์เป็นสิ่งสำคัญ เพื่อป้องกันปัญหา Resource Leak และทำให้ระบบทำงานได้อย่างมีประสิทธิภาพ

กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย

  1. การตรวจสอบการมีอยู่ของไฟล์ก่อนเปิด: ก่อนที่จะพยายามเปิดไฟล์ ควรตรวจสอบว่าไฟล์มีอยู่จริงหรือไม่ โดยใช้ฟังก์ชัน file_exists()
            $filename = 'data.txt';
            if (file_exists($filename)) {
                $handle = fopen($filename, 'r');
                // ...
            } else {
                echo "ไฟล์ {$filename} ไม่มีอยู่!";
            }
            
  2. การจัดการ Permission: ตรวจสอบให้แน่ใจว่า PHP มีสิทธิ์ในการอ่านและเขียนไฟล์ใน directory ที่ต้องการ หากไม่มีสิทธิ์ อาจทำให้ fopen() ล้มเหลว

    ตัวอย่าง: บนระบบ Linux/macOS คุณอาจต้องใช้คำสั่ง chmod เพื่อเปลี่ยน permission ของไฟล์หรือ directory

            chmod 777 data.txt  # ให้สิทธิ์อ่าน, เขียน, และ execute แก่ทุกคน (ระวังเรื่องความปลอดภัย)
            
  3. การจัดการ Error: ใช้ try...catch block เพื่อจัดการ Exception ที่อาจเกิดขึ้นระหว่างการจัดการไฟล์ (ถึงแม้ว่าฟังก์ชันเหล่านี้จะไม่ throw exception โดยตรง แต่การใช้ set_error_handler สามารถแปลง error ให้เป็น exception ได้)
            try {
                $filename = 'data.txt';
                $handle = fopen($filename, 'r');
    
                if (!$handle) {
                    throw new Exception("ไม่สามารถเปิดไฟล์ {$filename} ได้!");
                }
    
                // ... ทำงานกับไฟล์ ...
                fclose($handle);
    
            } catch (Exception $e) {
                echo "เกิดข้อผิดพลาด: " . $e->getMessage();
            }
            
  4. การจัดการ Character Encoding: เมื่ออ่านหรือเขียนไฟล์ที่มี character encoding เฉพาะ (เช่น UTF-8) ควรระบุ encoding ให้ถูกต้อง เพื่อป้องกันปัญหาการแสดงผลภาษา
            $filename = 'data.txt';
            $handle = fopen($filename, 'r');
    
            if ($handle) {
                stream_filter_append($handle, "convert.iconv.UTF-8/ISO-8859-1"); // แปลง encoding จาก ISO-8859-1 เป็น UTF-8
    
                while (!feof($handle)) {
                    $line = fgets($handle);
                    echo $line . "<br>";
                }
    
                fclose($handle);
            }
            
  5. การใช้ feof() อย่างระมัดระวัง: ฟังก์ชัน feof() จะคืนค่า true เมื่อ File Pointer อยู่ที่ End-Of-File (EOF) แล้ว การใช้ feof() ใน loop เพื่ออ่านไฟล์เป็นบรรทัด ควรใช้ร่วมกับ fgets() หรือ fgetss()
            $filename = 'data.txt';
            $handle = fopen($filename, 'r');
    
            if ($handle) {
                while (($line = fgets($handle)) !== false) { // อ่านทีละบรรทัด จนกว่า fgets() จะคืนค่า false
                    echo $line . "<br>";
                }
                fclose($handle);
            }
            

ในบทเรียนนี้ เราได้เรียนรู้พื้นฐานการจัดการไฟล์ใน PHP ด้วยฟังก์ชัน fopen(), fread(), fwrite(), และ fclose() รวมถึงข้อควรระวังและกรณีใช้งานจริงต่างๆ ในบทเรียนถัดไป เราจะเรียนรู้ฟังก์ชันอื่นๆ ที่ใช้ในการจัดการไฟล์ เช่น file_get_contents() และ file_put_contents()

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기