Home Back-End Bài 16: Các hàm xử lý và làm việc với file trong PHP

Bài 16: Các hàm xử lý và làm việc với file trong PHP

by Tân Hồng IT

Bài viết này sẽ xoay quanh về nội dung của các hàm xử lý và làm việc với file trong PHP.  Đối với một ngôn ngữ lập trình, làm việc với file và thư mục là điều bắt buộc mà không thể tránh khỏi. Vấn đề xử lý file trong PHP rất quan trọng khi các bạn muốn làm một số chức năng như cache hay log file nhằm giúp ứng dụng web chạy nhanh hơn,…

ham xu ly file trong php

Các hàm xử lý và làm việc với file trong PHP

Việc nắm vững kiến thức về xử lý file và quyền hạn của file, thư mục khi học PHP không những giúp bạn dễ dàng lưu trữ thông tin cho website mà còn giúp bạn tăng tính bảo mật cho các file và thư mục quan trọng.

Quá trình làm việc với một file trong PHP diễn ra như sau: Mở file –> Thao tác (Đọc, Ghi ) –> Đóng file. 

Các loại File được hỗ trợ trong PHP

  • File quản lý hệ thống
  • File logs
  • Loại file.txt
  • File.log
  • File.csv
  • Dạng file hình ảnh file.gif, file.jpg …
  • File cài đặt chương trình (program.ini)

Mở file với fopen

Để mở file trong PHP chúng ta dùng hàm fopen với cú pháp:

fopen($path, $mode);

Trong đó:

  • $path là đường dẫn đến file các bạn muốn mở.
  • $mode là thuộc tính bao gồm các quyền hạn truy cập vào file.

Danh sách ký hiệu thuộc tính $mode gồm quyền hạn truy cập vào file.

Mode Chú thích
r Chỉ được đọc (Read only)
r+ Được quyền đọc và ghi (Read + write)
w Chỉ được viết (write only)
x Tạo file mới chỉ để ghi.
w+ Được quyền đọc và viết (write + read). Nếu file này tồn tại thì nội dung cũ sẽ bị xóa đi và ghi lại nội dung mới, còn nếu file chưa tồn tại thì nó tạo file mới.
a Được quyền chỉ để viết và nếu file đã tồn tại nó sẽ ghi tiếp nội dung phía dưới, ngược lại nếu file không tồn tại nó tạo file mới.
a+ Được quyền cả viết lẫn đọc. Nếu file tồn tại nó sẽ ghi tiếp nội dung phía dưới, ngược lại nếu file không tồn tại nó tạo file mới
x+ Quyền tạo file mới để đọc và ghi.
b Mở dưới dạng chế độ binary

Hàm fopen() sẽ mở một file dựa vào đường dẫn truyền vào. Nếu truyền vào một URL, hàm sẽ sẽ tìm kiếm một trình xử lý giao thức(wrapper) cho URL đó, nếu không có trính xử lý nào đươc cung cấp, nó sẽ cảnh báo cho người dùng và sau đó tiếp tục như đối với các file bình thường.

Ví dụ:

<?php
$open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file
if (!$open)
    echo "Mở file không thành công";
else
    echo "Mở file thành công";
?>

Đọc File trong PHP

Có 3 cách đọc file thông thường trong PHP đó là đọc từng dòng, đọc từng ký tự và đọc hết file. Chúng ta sẽ đi vào từng cách đọc trên nhé!

Sử dụng hàm feof trong đọc file

Trước khi tìm hiểu các cách đọc file trong PHP mình xin giới thiệu các bạn hàm feof().

Hàm này có tác dụng đặt trong vòng lặp để sau khi đọc xong nó sẽ chuyển sang dòng mới hoặc ký tự mới đối với từng trường hợp đọc file.

Hàm feof() hữu ích khi lặp lại những dữ liệu không xác định được độ dài.

Đọc file từng dòng

Để đọc file từng dòng ta dùng hàm fgets($fp).

Ở cách này trước tiên chúng ta sẽ dùng feof để sau khi đọc xong nó sẽ chuyển sang dòng mới, và dùng hàm fgets để in ra từng dùng của file.

<?php
$fp = @fopen('demo.txt', "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    echo 'Mở file thành công <br>';
    // Lặp qua từng dòng để đọc
    while(!feof($fp))
    {
        echo fgets($fp);
    }
}
?>

Ở phương pháp đọc file theo từng dòng này, ngoài cách duyệt từng dòng bằng việc dùng hàm feof trong vòng lặp while như trên thì ta còn có một cách khác đó là chuyển file sang dạng mảng với mỗi phần tử trong mảng là 1 dòng của file, sau đó chỉ cần duyệt mảng và xuất ra màn hình.

$array = @file('demo.txt'); // chuyển đổi file sang mảng
foreach ($array as $value) {
    echo $value;
}

Trong đó: 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.

Đọc file từng ký tự

Để đọc file từng dòng ta dùng hàm fgetc($fp).

Ở cách này trước tiên chúng ta sẽ dùng feof để sau khi đọc xong nó sẽ chuyển sang dòng mới, và dùng hàm fgetc để in ra từng dùng của file.

<?php
$fp = @fopen('demo.txt', "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    echo 'Mở file thành công <br>';
    // Lặp qua từng ký tự để đọc
    while(!feof($fp))
    {
        echo fgetc($fp);
    }
}
?>

Đọc hết file với fread

Thông số trong hàm fread() chứa tên của file dùng để đọc dữ liệu và thông số thứ hai là một số lượng bytes nhất định để đọc dữ liệu.

Cú pháp: fread($file,$filesize)

<?php
$fp = @fopen('demo.txt', "r");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    echo 'Mở file thành công <br>';
    echo fread($file, filesize('demo.txt'));
} ?>

Ghi, Chèn dữ liệu vào file trong PHP

Để ghi nội dung vào file ta dùng hàm fwrite($fp, $content) trong đó $fp là đối tượng trả về lúc mở file, còn $content

Để ghi file thì bắt buộc file của bạn phải được mở ở chế độ mode có cho phép ghi file và tiếp đó dùng hàm fwrite để ghi dữ liệu.

Vì vậy mà việc ghi file sẽ phụ thuộc vào lúc bạn mở file như thế nào. Ví dụ lúc bạn mở file ghi đè thì lúc ghi file nó sẽ ghi đè, lúc bạn mở file ghi kiểu append thì lúc ghi file nó sẽ thêm xuống cuối file, nếu bạn mở file chỉ cho đọc thì bạn không thể ghi file được.

<?php
$fp = @fopen('demo.txt', "w");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    echo 'Mở file thành công <br>';
    fwrite($fp,'Đã mở file thành công, hãy tiếp tục thao tác mới');
}
?>

Đóng File

Quá trình làm việc với một file trong PHP diễn ra như sau: Mở file –> Thao tác (Đọc, Ghi ) –> Đóng file. Quy trình này là mặc định đối với nhiều ngôn ngữ lập trình khác nhau, chúng ta luôn phải tuân thủ theo quy trình đã mở thì phải đóng.

Việc mở file để sử dụng mà không đóng file rất nguy hiểm, vì thế sau khi sử dụng xong bạn nên đóng file để an toàn hơn và thu hồi tài nguyên hệ thống.

Để đóng file ta dùng hàm fclose($fp). Trong đó $fp là đối tượng trả về lúc bạn mở file.

<?php
$fp = @fopen('demo.txt', "w");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    echo 'Mở file thành công <br>';
    fwrite($fp,'Đã mở file thành công, hãy tiếp tục thao tác mới');
    fclose($fs); //đóng file
}
?>

Vì thế những ví dụ ở phần đọc file bạn đều phải bổ sung thêm hàm đóng file vào thì code mới đúng và hoàn chỉnh các bạn nhé!

Các hàm xử lí file khác

Kiểm tra file có tồn tại không?

Trong PHP có cung xấp cho chúng ta hàm file_exists($path) để kiểm tra sự tồn tại của file, hàm sẽ trả về true nếu file tồn tại và ngược lại false nếu không. Trong đó $path là đường dẫn đến file cần test.

Bạn cũng có thể sử dụng hàm này khi bạn tạo ra một tập tin mới và bạn muốn đảm bảo rằng các tập tin chưa từng tồn tại trên server.

<?php
if (file_exists('STDIO.txt'))
{
    echo 'File exists';
}
?>

Kiểm tra cấp quyền với file

Để kiểm tra file có được cấp quyền gì không thì chúng ta dùng hàm is_writable() . Hàm này sẽ trả về true nếu được quyền ghi và ngược lại false nếu không được quyền ghi.

<?php
$fp = @fopen('demo.txt', "w");
// Kiểm tra file mở thành công không
if (!$fp) {
    echo 'Mở file không thành công';
}
else
{
    if(is_writable('demo.txt')){       
        fwrite($fp, 'Được phép ghi');}
    else{
        echo 'Không Được phép ghi';}
    fclose($fp);
}

Lấy nội dung của file hàm file_get_contents

Cú pháp: file_get_contents($path)

Trong đó $path là đường dẫn đến file, hoặc 1 đường link URL dẫn tới trang web chứa file.

echo file_get_contents('demo.txt');

Đổi tên file

Để đổi tên file ta dùng hàm rename($oldname, $newname), trong đó $oldname là đường dẫn đến file cần đổi tên, $newname là đường dẫn mới có kèm tên file cần đổi . Nếu bạn chỉ muốn đổi tên thôi thì đường dẫn của cả 2 biến giống nhau, chỉ khác nhau ở cái tên file.

Nếu tên file mới bị trùng thì file đó sẽ bị ghi đè.

rename('demo.txt', 'newdemo.txt');

Copy file

Cú pháp: copy($source, $newpath)

Trong đó $source là path file cần copy và $newpathlà path file cần di chuyển tới.

copy('demo.txt', 'newdemo.txt');

Xóa file

Ta dùng hàm unlink($path) để xóa file. Trong đó $path là đường dẫn đến file cần xóa.

<?php
if (file_exists('demo.txt'))
{
    if(unlink('demo.txt'))
        echo 'Xoá thành công';
    else
        echo 'Không thành công';
}
?>

Ghi toàn bộ nội dung chuỗi ra file

Đây là cách ghi toàn bộ một chuỗi ra file ngắn gọn (thay cho việc phải sử dụng fopen, fread, fclose).

Cú pháp: file_put_contents($path, $contents)

file_put_contents('demo.txt', 'đây là nội dung sẽ được ghi ra file');

Tạo một thư mục ( folder) mới

Cú pháp: mkdir($path)

Trong đó $path là đường dẫn đến folder cần tạo.

Ví dụ:

mkdir('webdevelopment/php/phpcanban');
Lưu ý: tên folder cuối cùng lằn trong link chính là tên folder bạn cần tạo và tất cả các folder trước nó bạn chắc chắn là phải có, nếu không sẽ bị lỗi.
Từ ví dụ trên ta sẽ nhận ra rằng ta đã phải có folder webdevelopment và trong nó là folder con có tên là php thì mới tạo thêm được.

Kiểm tra sự tồn tại đường dẫn thư mục

Cú pháp kiểm tra sự tồn tại của thư mục trong php là is_dir(path)

if(is_dir('phpcanban')){
    echo 'Folder này hiện đang tồn Tại';
}

Kết thúc

Qua bài viết trên mình đã nói qua về những hàm cần thiết về xử lý file cần biết trong PHP, Các bạn hãy thao khảo tìm mốt số bài tập thực hành để nâng cao hiểu biết của bản thân hơn nhé!

Ngoài ra còn rất nhiều hàm xử lý về file khác mà mình chưa nói tới, các bạn có thể tham khảo tại đây.

Bài viết tiếp theo mình sẽ sơ lược qua về vấn đề xử lý thời gian, ngày tháng trong PHP các bạn hãy đón đọc nhé!

Nếu các bạn cảm thấy Website TanHongIT.Com thật sự hữu ích mình mong các bạn có thể chia sẻ những bài viết đến cho cộng đồng cùng thao khảo nhé. Cảm ơn các bạn !!!

Các bạn có bất kì thắc mắc cần được hỗ trợ hay yêu cầu các phần mềm, thủ thuật, khoá học,… thì cứ để lại comment bên dưới bài viết hoặc liên hệ qua fanpage của TanHongIT để được hỗ trợ nhé! Mình sẽ cố gắng chia sẻ cho các bạn mọi thứ cần thiết nhất!

Xem thêm:

CHÚC CÁC BẠN THÀNH CÔNG VÀ VUI VẺ

Related Posts

0 0 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x