/home/xoa-thu-muc-va-file-trong-mot-thu-muc-php

Xóa thư mục và file trong một thư mục - PHP

Published on | Updated

Do đang loay hoay với việc chỉnh sửa plugin WP Super Cache để nó gộp các file js/css lại khi tạo cache nhằm giảm tải khi load trang. Tiện động đến việc phải xóa cả thư mục chứa các file js/css đã gộp nên mình viết luôn bài này.

Nói dài dòng khó hiểu. Tóm gọn lại là thế này: Xóa tất cả mọi thứ trong một thư mục. Mọi thứ ở đây bao gồm các thư mục con và các tệp (file).

Trong PHP, do cơ chế bảo mật nên muốn xóa một thư mục, bạn phải xóa hết các tệp có trong thư mục đó trước. Tức là chỉ có thể xóa một thư mục rỗng.

Cho nên tôi trình bày ở đây một function nhỏ có chức năng xóa các tệp và thư mục con luôn.

Bạn có thể mở rộng thêm function này bằng việc thêm vào việc kiểm tra logic: nếu không phải là thư mục => xóa tệp.

function delete_directory($dirname) {
    if (is_dir($dirname))
        $dir_handle = opendir($dirname);
        if (!$dir_handle)
            return false;

    while($file = readdir($dir_handle)) {
        if ($file != "." && $file != "..") {
            if (!is_dir($dirname."/".$file))
                unlink($dirname."/".$file);
            else
                delete_directory($dirname.'/'.$file);
        }
    }

    closedir($dir_handle);
    rmdir($dirname);
    return true;
}

Nhìn function trên khá đơn giản và dễ hiểu phải không?
Khoan khoan, đừng vội dùng nó ngay, mà hãy đọc phần dưới đây.
Tôi sẽ trình bày một function khác, sử dụng đệ quy và nhìn sẽ gọn nhẹ hơn nhiều.
Nếu bạn chưa hiểu đệ quy là gì thì tôi giải thích ngắn gọn như sau:
- Một hàm được gọi là hàm đệ quy khi trong quá trình thực hiện nó tự gọi lại chính nó để thực hiện.
Muốn chi tiết hơn bạn tìm định nghĩa trên Google nhé.

<?php
/*
* php delete function that deals with directories recursively
*/
function delete_files($target) {
    if (is_dir($target)) {
        $files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned

        foreach( $files as $file )
        {
            delete_files( $file );
        }

        rmdir( $target );
    } elseif (is_file($target)) {
        unlink( $target );
    }
}

Nhìn thấy thông thoáng và dễ hiểu hơn function 1 chứ?

Viết lan man chém gió đến đây thôi. Đi sửa WP Super cache tiếp đây. Nhiều lỗi quá =))