PHP - Append File

Trong PHP, hàm fopen() trả về con trỏ tệp của một tệp được sử dụng trong các chế độ mở khác nhau như "w" cho chế độ ghi, "r" cho chế độ đọc và "r+" cho chế độ đọc/ghi đồng thời, và chế độ "a" đại diện cho chế độ thêm.

Khi một tệp được mở với tham số chế độ "w", nó luôn mở một tệp mới. Điều này có nghĩa là nếu tệp đã tồn tại, nội dung của nó sẽ bị mất. Hàm fwrite() tiếp theo sẽ đặt dữ liệu ở vị trí bắt đầu của tệp.

Giả sử rằng một tệp "new.txt" có sẵn với nội dung sau −

Hello World
TutorialsPoint
PHP Tutorial

Câu tuyên bố sau đây −

$fp = fopen("new.txt", "w");

Xóa tất cả dữ liệu hiện có trước khi nội dung mới được ghi.

Read/Write Mode

Rõ ràng, không thể thêm dữ liệu mới nếu tệp được mở với chế độ "r". Tuy nhiên, chế độ "r+" hoặc "w+" mở tệp trong chế độ "r/w", nhưng một câu lệnh fwrite() ngay sau khi mở tệp sẽ ghi đè lên nội dung.

Example

Hãy xem xét đoạn mã sau −

<?php
   $fp = fopen("new.txt", "r+");
   fwrite($fp, "PHP-MySQL Tutorial\n");
   fclose($fp);
?>

Với đoạn mã này, nội dung của tệp "new.txt" bây giờ sẽ trở thành −

PHP-MySQL Tutorial
lsPoint
PHP Tutorial

Để đảm bảo rằng nội dung mới được thêm vào cuối tệp hiện có, chúng ta cần đặt con trỏ tệp về cuối trước khi thực hiện thao tác ghi. (Vị trí ban đầu của con trỏ tệp ở byte thứ 0)

The fseek() Function

Hàm fseek() của PHP cho phép bạn đặt con trỏ tệp ở bất kỳ vị trí nào bạn muốn −

fseek(resource $stream, int $offset, int $whence = SEEK_SET): int

Tham số $whence là từ nơi mà độ lệch được tính. Giá trị của nó là −

  • SEEK_SET − Đặt vị trí bằng với số byte dịch chuyển.

  • SEEK_CUR − Đặt vị trí đến vị trí hiện tại cộng với độ lệch.

  • SEEK_END − Đặt vị trí đến cuối tệp cộng với độ lệch.

Example

Vì vậy, chúng ta cần di chuyển con trỏ đến cuối bằng cách sử dụng hàm fseek() như trong đoạn mã sau, đoạn mã này thêm nội dung mới vào cuối.

<?php
   $fp = fopen("new.txt", "r+");
   fseek($fp, 0, SEEK_END);
   fwrite($fp, "\nPHP-MySQL Tutorial\n");
   fclose($fp);
?>

Bây giờ hãy kiểm tra nội dung của "new.txt". Nó sẽ có đoạn văn bản sau −

Hello World
TutorialsPoint
PHP Tutorial
PHP-MySQL Tutorial

Append Mode

Thay vì di chuyển con trỏ đến cuối một cách thủ công, tham số "a" trong hàm fopen() mở tệp ở chế độ thêm. Mỗi câu lệnh fwrite() sẽ thêm nội dung vào cuối các nội dung hiện có, bằng cách tự động di chuyển con trỏ đến vị trí SEEK_END.

<?php
   $fp = fopen("new.txt", "a");
   fwrite($fp, "\nPHP-MySQL Tutorial\n");
   fclose($fp);
?>

Một trong các chế độ được phép cho hàm fopen() là chế độ "r+", trong đó tệp thực hiện thao tác đọc/thêm. Để đọc dữ liệu từ bất kỳ vị trí nào, bạn có thể đặt con trỏ đến byte mong muốn bằng fseek(). Tuy nhiên, mỗi thao tác fwrite() chỉ ghi nội dung mới ở cuối tệp.

Example

Trong chương trình dưới đây, tệp được mở ở chế độ "a+". Để đọc dòng đầu tiên, chúng ta di chuyển vị trí tệp về vị trí 0, tức là vị trí từ đầu. Tuy nhiên, câu lệnh fwrite() vẫn thêm nội dung mới vào cuối và không ghi đè lên dòng tiếp theo như nó sẽ làm nếu mở ở chế độ "r+".

<?php
   $fp = fopen("new.txt", "a+");
   fseek($fp, 0, SEEK_SET);
   $data = fread($fp, 12);
   echo $data;
   fwrite($fp, "PHP-File Handling");
   fclose ($fp);
?>

Vì vậy, chúng ta có thể thêm dữ liệu vào một tệp hiện có nếu nó được mở ở chế độ "r+/w+" hoặc "a/a+"