Bài 10: Các hàm xử lý file trong php

1. Lưu ý: Trước khi làm việc với file chúng ta cần lắm chắc một vấn đề là file đó có được cấp những quyền(Permission) gì để làm việc với file đó. Thông qua một hàm chmod() hoặc riêng với trường hợp ghi dữ liệu is_writable() . Trong PHP để kiểm tra chmod một file thì ta làm như sau. ...

1. Lưu ý:

Trước khi làm việc với file chúng ta cần lắm chắc một vấn đề là file đó có được cấp những quyền(Permission) gì để làm việc với file đó. Thông qua một hàm chmod() hoặc riêng với trường hợp ghi dữ liệu is_writable(). Trong PHP để kiểm tra chmod một file thì ta làm như sau.

$chmod = substr(sprintf('%o', fileperms($_SERVER['DOCUMENT_ROOT'].'/demo.txt')), -4);
print_r($chmod); die();
//Kết quả: 0777

Hàm chmod($filename, int $mode);

Hàm nay cho phép bạn set quyền truy cập tới một file bất kỳ.

$chmod = substr(sprintf('%o', fileperms($_SERVER['DOCUMENT_ROOT'].'/demo.txt')), -4);
if($chmod != 0777){	         @chmod($_SERVER['DOCUMENT_ROOT'].'/demo.txt',0777);
}

2. Mở file

Để mở một file ta dùng cú pháp sau: open($path, $option). Trong đó $path là đường dẫn đến file cần mở, $option là quyền cho phép thao tác trên file.

Ta có danh sách các quyền sau:

ModeDiễn giải
r Read only
r+ Read + Write
w Write only
w+ 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 Mở dưới dạng append dữ liệu, chỉ có write 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+ Mở dưới dạng append dữ liệu, bao gồm write và read. 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
b Mở dưới dạng chế độ binary
// Mở một file, ta dùng dấu @ đặt trước hàm fopen
// để phòng trường hợp đường dẫn $path ta truyền
// vào bị sai nó sẽ không bung lỗi ra màn hình.
// Đường dẫn $path có thể là đường dẫn tương đối
// hoặc tuyệt đối đều được
  
$path = 'demo.txt';
$fp = @fopen($path, "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';
}

3. Đọc file

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.

fgetc($fp) để đọc theo từng ký tự.

-fgets($fp) để đọc theo từng dòng.

- Đối với đọc từng dòng và đọc từng ký tự ta phải dùng hàm feof($fp) đặt trong vòng lặp while để sau khi đọc xong nó sẽ chuyển sang dòng mới hoặc ký tự mới.

- Để đọc hết tất cả file ta dùng hàm fread($fp, $size), trong đó $fp là đối tượng lúc mở file còn $size là kích cỡ của file cần đọc. Để lấy kích cỡ của file cần đọc ta dùng hàm filesize($path).

function size_calculator($size){
    $units = array(' B', ' KB', ' MB', ' GB', ' TB');
    for ($i = 0; $size > 1024; $i++) { $size /= 1024; }
    return round($size, 2).$units[$i];
}
$filename = $_SERVER['DOCUMENT_ROOT'].'/demo.txt';
$size = filesize($filename);
print_r(size_calculator($size)); die();
// Kết quả: 33B

Ví dụ: Đọc file từng ký tự

$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{
    // Lặp qua từng ký tự để đọc
    while(!feof($fp)) {
        echo fgetc($fp);
    }
}

Ví dụ: Đọc file từng dòng

$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{
    // Lặp qua từng dòng để đọc
    while(!feof($fp)){
        echo fgets($fp);
    }
}

Ví dụ: Đọc hết file

$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{
    // Đọc file và trả về nội dung
    $data = fread($fp, filesize('demo.txt'));
    echo $data;
}

4. Ghi file

Để 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 là nội dung muốn ghi vào.

Việc ghi file 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.

$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{
    $data = 'example.com file functions tutorial';
    fwrite($fp, $data);
}

5. Đóng File

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. Để đóng file ta dùng hàm fclose($fp) trong đó $fp là đối tượng trả về lúc bạn mở file.

$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{
    $data = 'code24h.com file functions tutorial';
    // Ghi file
    fwrite($fp, $data);
  
    // Đóng file
    fclose($fp);
}

6. Các hàm xử lý file khác

6.1. file_exists($path)

Hàm này cho phép kiểm tra file có tồn tại không

if (file_exists('demo.txt')){
    echo 'File tồn tại';
}

6.2. is_writable ($path)

Hàm này cho phép kiểm tra file có quyền ghi hay không.

$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, 'Welcome');
    }
    fclose($fp);
}

6.3. rename($oldname, $newname)

Hàm này cho phép bạn đổi tên file thành tên file mới. 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 đè.

$oldfile = $_SERVER['DOCUMENT_ROOT'].'/demo.txt';
$newfile = $_SERVER['DOCUMENT_ROOT'].'/demo_new.txt';
$result = rename($oldfile, $newfile);
print_r($result);
// Kết quả: TRUE or FALSE

6.4. copy($source, $dest)

Hàm này cho phép copy một file từ thư mục này tới thu mục khác trong đó $source là đường dẫn file cần copy và $dest là đường dẫn file cần di chuyển tới. Nếu bạn muốn đổi luôn tên thì đường dẫn $dest bạn khai báo một cái tên khác.

$sourse = $_SERVER['DOCUMENT_ROOT'].'/demo.txt';
$dest = $_SERVER['DOCUMENT_ROOT'].'/dest/demo.txt';
$result = copy($sourse, $dest);
print_r($result);
// Kết quả: TRUE or FALSE

6.5. unlink($path)

Hàm này cho phép bạn xóa một file bất kỳ trong đó $path là đường dẫn file cần xóa.

$sourse = $_SERVER['DOCUMENT_ROOT'].'/demo.txt';
$result= @unlink($sourse);
print_r($result);
// Kết quả: TRUE or FALSE

Tổng kết

Việc xử lý file trong php rất quan trọng vì trong các ứng dụng thực tế ta hay dùng file để lưu trữ dữ liệu cho website hoặc là lưu trữ một thứ gì đó để cho nhằm giúp ứng dụng chạy nhanh hơn, vì thế tôi viết bài này giúp các bạn làm quen với một số hàm liên quan đến file như đọc file, ghi file, tạo folder mới, xóa folder, xóa file. Trong bài này tôi không đề cập đến vấn đề upload file.

0