Các hàm tạo, đọc, ghi file

Phần này trình bày thao tác với file cơ bản với các tác vụ như mở file, đọc nội dung của file trong PHP với các hàm như: fopen() fwrite() fclose() file() file_get_contents() file_put_contents(). Bước đầu tập trung chủ yếu làm việc với chuỗi, còn kỹ thuật làm việc với dữ liệu nhị phân (các mảng byte) sẽ ở nội dung khác.

PHP đưa ra một số hàm với mục đích để làm việc với file như tạo file, đọc file, upload, biên tập ...

Hàm fopen và fclose trong PHP

fopen() là hàm mở file để chuẩn bị đọc, ghi thông tin, cú pháp như sau:

$file = fopen($filename, $mode);

$filename tên file với đường dẫn đầy đủ. Hoặc là URL của file cần mở. $mode chế độ mở file với một số giá trị như sau (chú ý khi mở file, tùy mode mà con trỏ xác định vị trí đang làm việc có thể ở đầu hoặc cuối file, các mode ở dưới thì aa+ con trỏ ở cuối - nối thêm vào file, còn các mode khác con trỏ ở đầu.):

  • "r" - Mở file chỉ để đọc
  • "r+" - Mở file dể đọc và ghi
  • "w" - Mở file chỉ để ghi, khi mở nội dung trong file bị xóa sạch hoặc nếu file đó không tồn tại thì sẽ cố gắng tạo ra file mới.
  • "w+" - Mở file có thể đọc / ghi, khi mở nội dung trong file bị xóa sạch hoặc nếu file đó không tồn tại thì sẽ cố gắng tạo ra file mới.
  • "a" - Mở file chỉ để ghi, bắt đầu ghi ở vị trí cuối file, có tạo file mới nếu không tồn tại.
  • "a+" - Mở file để đọc/ghi.
  • "x" - Tạo file mới để ghi. Trả về false và phát sinh lỗi nếu file đã có
  • "x+" - Tạo file mới đọc/ghi. Trả về false và phát sinh lỗi nếu file đã có.
  • "c" - Mở file chỉ ghi hoặc tạo mới nếu không tồn tại.
  • "c+" - Mở file đọc/ghi hoặc tạo mới nếu không tồn tại.

Nếu mở file thành công nó trả về tài nguyên gắn với stream của file, từ tài nguyên này dùng các hàm khác nhau để đọc, ghi, di chuyển con trỏ.

Hàm feof($file) là hàm cho biết vị trí đang ở cuối file hay không, trả về true là ở cuối file.

Sau khi thực hiện các tác vụ trên tài nguyên file đang mở thì phải đóng lại để giải phóng tài nguyên bằng cách gọi hàm fclose

Ví dụ sau tạo ra file file.txt, file tạo ra ở cùng với thư mục chứa code PHP, kết quả trả về là tài nguyên lưu vào $myfile.

$myfile = fopen("file.txt", "w");

    ...

// đóng file
fclose($myfile);
Hàmchức năng
fopen($filename, $mode) Mở file, tạo file mới
fclose($stream) Đóng file đang mở
feof($stream) Trả về true nếu con trỏ ở cuối file

Ghi dữ liệu vào file với hàm fwrite / fputs trong PHP

Sau khi file đã được mở thì bạn có thể ghi dữ liệu (Binary-safe, chuỗi) cần thiết vào file, để làm điều đó dùng hàm fwrite() cũng chính là hàm fputs

fwrite($myfile, $txt);

//$myfile: là file đã được mở để ghi
//$text: là chuỗi cần ghi vào file.

Ví dụ sau ghi lại tên hai người vào file names.txt

<?php
    // Mở file để ghi (nội dung cũ bị xóa) hoặc tạo file mới nếu không tồn tại
    $myfile = fopen("names.txt", "w");
    
    $txt = "John\n";
    fwrite($myfile, $txt);
    $txt = "David\n";
    fwrite($myfile, $txt);
    
    fclose($myfile);
    
    /* Nộ dung file:
    John
    David
    */
?>

Chú ý trước khi gọi hàm fwrite() cần phải gọi hàm fopen() và cuối cùng sau khi ghi xong các nội dung vào file thì cần gọi fclose() để đóng file thu hồi tài nguyên hệ thống.

Dùng ký hiệu \n để ghi dòng mới (xuống dòng).

Ví dụ, ghi thêm nội dung vào file

Nếu muốn nối thêm nội dung vào file, bạn cần mở file với chế độ nối file 'a', Ví dụ:

<?php
    $myFile = "test.txt";
    $fh = fopen($myFile, 'a');
    fwrite($fh, "Some text");
    fclose($fh);
?>

Khi mở file bằng chế độ 'a' con trỏ file sẽ trỏ đến cuối file, đảm bảo rằng nội dung ghi sẽ nối vào file

Đọc nội dung file, hàm fread trong PHP

Để đọc các byte trong file, sử dụng hàm fread như sau:

fread($stream,$length);

Với $stream là file đã mở để đọc và $length là số byte cần đọc. Bạn có thể dùng hàm filesize($filename) để lấy cỡ file (bao nhiêu byte). Ví dụ sau, mở một file ảnh từ địa chỉ URL, sau đó đọc toàn bộ nội dung của file, lưu lại file trên đĩa

<?php
    $urlImage = 'https://raw.githubusercontent.com/xuanthulabnet/learn-php/master/imgs/html-001.png';
    $fImage = fopen($urlImage, 'r');

    // Đọc đến cuối file, mõi lần đọc 4000 byte, lưu dữ liệu đọc được vào $data
    $data = null;
    while (!feof($fImage))
    {
        $data .= fread($fImage, 4000);
    }
    fclose($fImage);
    echo strlen($data) . ' byte đọc được <br>';

    // Lưu dữ liệu đọc được vào file test.png
    $filename = __DIR__ .'/test.png';
    $streamwrite = fopen($filename, 'w');
    fwrite($streamwrite, $data);
    fclose($streamwrite);
    echo 'Lưu file tại:<br>' . $filename;
?>

Đọc một chuỗi trong file với hàm fgets trong PHP

Hàm fgets($file) đọc một dòng tại vị trí con trỏ file hiện tại. Nếu vị trí con trỏ ở cuối file hàm sẽ trả về false / lỗi. Để kiểm tra con trỏ hiện tại ở cuối không dùng hàm feof($file), nếu trả về true là ở cuối.

Ví dụ, mở file đọc tất cả các dòng:

<?php
// Mở file để đọc - con trỏ ở đầu
$myfile = fopen("https://raw.githubusercontent.com/xuanthulabnet/learn-php/master/Readme.md", "r");

// Đọc từng dòng của file cho đến khi con trỏ dịch đến cuỗi file (hết file)
while(!feof($myfile)) {
    $line = fgets($myfile);
    echo $line. "
"; } fclose($myfile); ?>

Đọc toàn bộ nội dung file trong PHP

Hàm file() đọc nội dung của file và đưa vào một mảng. Mỗi phần tử của mảng tương ứng với một dòng của file.

<?php
    $read = file('https://raw.githubusercontent.com/xuanthulabnet/learn-php/master/Readme.md');
    foreach ($read as $line) {
        echo $line ."<br>";
    }

?>

Đọc toàn bộ nội dung file với hàm file_get_contents trong PHP

Hàm file_get_contents($filename) - đọc toàn bộ nội dung một file trả về một chuỗi là nội dung đó, tham số chỉ ra là tên filec cần đọc

$content = file_get_contents('https://raw.githubusercontent.com/xuanthulabnet/learn-php/master/Readme.md');
echo $content;

Hàm file_put_contents trong PHP

Hàm file_put_contents($filename, $data, $flag = 0) lưu dữ liệu vào file có tên $filename, dữ liệu $data là một chuỗi, mảng dữ liệu. Nếu $flag = 0 sẽ ghi đè dữ liệu file nếu file tồn tại. Nếu $flag = FILE_APPEND thì nối thêm dữ liệu vào file.

// Ghi nói thêm một chuỗi vào file
file_put_contents('names.txt', 'xuanthulab', FILE_APPEND);

Một số hàm về file trong PHP

Hàm về file Diễn giải
unlink($filename) Hàm unlink trong PHP, dùng để xóa file trên đĩa
copy($filename_source, $$filename_dest) Hàm copy trong PHP, dùng để copy file trên đĩa
rename($oldname, $newname) Hàm copy trong PHP, dùng để đổi tên file trên đĩa
file_exists($filename) Hàm file_exists trong PHP, trả về true thì file đang tồn tại

Đăng ký nhận bài viết mới