Bài 21: Làm việc với thu mục trong PHP

“Hãy hòa nhã với những kẻ dở hơi. Ai biết được ngày sau bạn có thể phải làm việc cho một kẻ như vậy.”

Bill Gates

Microsoft

Trong bài học này, bạn sẽ học cách xử lý các vấn đề liên quan đến thư mục bằng PHP.

Làm việc với thư mục trong PHP
Làm việc với thư mục trong PHP

Làm việc với thư mục trong PHP

Trong bài trước, bạn đã học cách làm việc với các tệp trong PHP. Thì tương tự, trong PHP cũng cho phép bạn làm việc với các thư mục .

Ví dụ bạn có thể:

  • Mở một thư mục và đọc nội dung của nó,
  • Tạo hoặc xóa một thư mục
  • Liệt kê tất cả các tệp trong thư mục.
  • v.v.

1. Cách tạo một thư mục mới bằng PHP

Để tạo một thư mục mới bạn sử dụng hàm mkdir() của PHP với đường dẫn và tên của thư mục sẽ được tạo, như trong ví dụ dưới đây:

<?php
// Đường dẫn thư mục
$dir = "testdir";
 
// Kiểm tra thư mục đã tồn tại hay chưa
if(!file_exists($dir)){
    // Tạo một thư mục mới
    if(mkdir($dir)){
        echo "Tạo thư mục thành công.";
    } else{
        echo "ERROR: Không thể tạo thư mục.";
    }
} else{
    echo "ERROR: Thư mục đã tồn tại.";
}
?>

Lưu ý: Để làm cho hàm mkdir() hoạt động, các thư mục cha trong tham số đường dẫn thư mục phải tồn tại, ví dụ, nếu bạn chỉ định đường dẫn thư mục là testdir/subir thì thư mục testdir phải tồn tại nếu không PHP sẽ báo lỗi.

2. Cách sao chép file từ vị trí này sang vị trí khác trong PHP

Bạn có thể sao chép một file từ vị trí này sang vị trí khác bằng cách gọi hàm copy() trong PHP với các đường dẫn nguồn và đích của file làm đối số.

Nếu file đích đã tồn tại, nó sẽ bị ghi đè. Đây là một ví dụ tạo ra một bản sao của tệp ‘example.txt’ trong thư mục sao lưu.

<?php
// Đường dẫn file nguồn
$file = "example.txt";
 
// Đường dẫn file đích
$newfile = "backup/example.txt";
 
// Kiểm tra file cần copy có tồn tại hay không
if(file_exists($file)){
    // Tạo file copy
    if(copy($file, $newfile)){
        echo "Copy file thành công.";
    } else{
        echo "ERROR: File không thể copy.";
    }
} else{
    echo "ERROR: File không tồn tại.";
}
?>

Lưu ý: Để làm cho ví dụ này hoạt động, thư mục đích được sao lưu và tệp nguồn (tức là thư mục backup) phải tồn tại nếu không PHP sẽ báo lỗi.

3. Liệt kê tất cả các file trong một thư mục trong PHP

Bạn có thể sử dụng hàm scandir() của PHP để liệt kê các file và thư mục bên trong đường dẫn đã chỉ định.

Chúng ta sẽ thử tạo một hàm tùy chỉnh để liệt kê đệ quy tất cả các file trong một thư mục bằng PHP.

Kịch bản này sẽ rất hữu ích nếu bạn đang làm việc với cấu trúc thư mục được lồng sâu.

<?php
// Define một function để xuất các file trong một thư mục
function outputFiles($path){
    // Kiểm tra thư mục có tồn tại hay không
    if(file_exists($path) && is_dir($path)){
        // Quét tất cả các file trong thư mục
        $result = scandir($path);
        
        // Lọc ra các thư mục hiện tại (.) và các thư mục cha (..)
        $files = array_diff($result, array('.', '..'));
        
        if(count($files) > 0){
            // Lặp qua mảng đã trả lại
            foreach($files as $file){
                if(is_file("$path/$file")){
                    // Hiển thị tên File
                    echo $file . "<br>";
                } else if(is_dir("$path/$file")){
                    // Gọi đệ quy hàm nếu tìm thấy thư mục
                    outputFiles("$path/$file");
                }
            }
        } else{
            echo "ERROR: Không có file nào trong thư mục.";
        }
    } else {
        echo "ERROR: Thư mục không tồn tại.";
    }
}
 
// Gọi hàm
outputFiles("mydir");
?>

4. Cách liệt kê tất cả các file thuộc một loại nhất định

Trong khi làm việc trên cấu trúc thư mục và file, đôi khi bạn cần tìm ra một số loại tệp nhất định ở bên trong thư mục nào đó, ví dụ:

  • Chỉ liệt kê các tệp .text hoặc .png, v.v

Bạn có thể thực hiện hành động này một cách dễ dàng với hàm glob().

Đoạn code PHP trong ví dụ sau sẽ tìm kiếm thư mục documents và liệt kê tất cả các file có đuôi là .text. Nó sẽ không tìm kiếm file ở trong các thư mục con.

<?php
/* Tìm kiếm thư mục và lặp qua mảng.
Trả về các file có đuôi .txt */
foreach(glob("documents/*.txt") as $file){
    echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
}
?>

Hàm glob() cũng có thể được sử dụng để tìm tất cả các file trong một thư mục hoặc thư mục con của nó.

Hàm được định nghĩa trong ví dụ sau sẽ liệt kê đệ quy tất cả các file trong một thư mục, giống như chúng ta đã thực hiện trong ví dụ trước với hàm scandir().

<?php
// Define một function để xuất các file trong thư mục 
function outputFiles($path){
    // Kiểm tra thư mục có tồn tại hay không
    if(file_exists($path) && is_dir($path)){
        // Tìm kiếm các file trong thư mục này.
        $files = glob($path ."/*");
        if(count($files) > 0){
            // Lặp qua mảng đã trả về
            foreach($files as $file){
                if(is_file("$file")){
                    // Hiển thị tên file
                    echo basename($file) . "<br>";
                } else if(is_dir("$file")){
                    // Gọi đệ quy hàm nếu tìm thấy thư mục
                    outputFiles("$file");
                }
            }
        } else{
            echo "ERROR: Không tìm thấy file nào trong thư mục.";
        }
    } else {
        echo "ERROR: Thư mục không tồn tại.";
    }
}
 
// Gọi hàm
outputFiles("mydir");
?>

Tổng kết.

Như vậy là qua bài này bạn đã biết một số thao tác cơ bản để làm việc với thư mục trong PHP. Hãy thực hành lại các ví dụ để hiểu rõ các vấn đề về thư mục nhé.

Có thể bạn muốn xem

Pesudo class trong CSS

Bộ chọn lớp giả CSS (Pesudo class Selector) khớp với các thành phần dựa trên một điều kiện bổ sung và không nhất thiết phải được định nghĩa trong DOM tree.

Pesudo Element trong CSS

Sử dụng phần tử giả (Pesudo element) trong CSS là một cách để áp dụng các quy tắc CSS cho phần tử không xác định vị trí trong DOM tree.

Leave a reply

Please enter your comment!
Please enter your name here