在 PHP 网站中可能会遇到需要用 PHP 删除文件夹的情况,例如一些网盘或在线文件管理等。最近我开发的一个在线文件管理器就需要用 PHP 删除文件夹。在开发删除功能的时候遇到了一个问题,PHP 删除文件夹的函数 rmdir 只能删除空文件夹,在遇到非空文件夹的情况下就会报错。要解决这个问题只能写一个自定义函数或方法,这里我就记录一下我写的函数,可以直接调用。

函数代码

<?php

//  删除文件或文件夹,接收一个数组,支持批量删除
function delete($fileName = array()) {
    $success = array();  //  记录已删除的文件

    //  如果数组为空
    if (count($fileName) < 1) {
        return array(
            'result' => false,
            'info' => '文件名不能为空!'
        );
    }

    for ($i = 0;$i < count($fileName);$i ++) {
        //  文件是否存在,如果不存在就跳过
        if (file_exists($fileName[$i])) {
            //  是否是文件夹
            if (!is_dir($fileName[$i])) {
                //  如果不是文件夹就直接删除
                if (unlink($fileName[$i])) {
                    //  如果删除成功就把文件名添加到已删除文件的数组
                    array_push($success, $fileName[$i]);
                }
            }else {
                //  如果是文件夹就匹配文件夹内的所有文件
                $fileList = glob($fileName[$i] . '/*');
                //  是否匹配到文件
                if (count($fileList) < 1) {
                    //  如果没有匹配到文件说明这是一个空文件夹,直接删除
                    if (rmdir($fileName[$i])) {
                        //  如果删除成功就把文件夹名添加到已删除文件的数组
                        array_push($success, $fileName[$i]);
                    }
                }else {
                    //  如果匹配到文件就调用自身继续删除
                    $result = delete($fileList);

                    foreach($result as $val) {
                        //  把返回结果添加到已删除文件的数组
                        array_push($success, $val);
                    }
                }
            }

            //  判断需要删除的文件或文件夹是否还存在
            if (file_exists($fileName[$i])) {
                //  如果还存在就调用自身继续删除
                $result = delete(array($fileName[$i]));

                foreach($result as $val) {
                    //  把返回的结果添加到已删除文件的数组
                    array_push($success, $val);
                }
            }
        }
    }

    //  执行完毕后返回已删除的文件或文件夹的名称
    return $success;
}

使用

下面是一个包含文件和文件夹的目录:

D:.
│  delete.php
│  favicon.ico
│
├─app
│      getimg.json
│      imgInfo.json
│      server.php
│
├─css
│  │  app.287096e6.css
│  │  app.2d4a1a45.css
│  │  app.6582a0f0.css
│  │  app.eef9e5aa.css
│  │  chunk-vendors.4f7bf8cd.css
│  │
│  └─src
│      │  App.vue
│      │  main.js
│      │
│      ├─assets
│      │      logo.png
│      │
│      └─components
│              content.vue
│
└─js
        app.27d4ea4a.js
        app.27d4ea4a.js.map
        app.77d9468e.js
        app.77d9468e.js.map
        app.7d454f08.js
        app.7d454f08.js.map
        app.931622e1.js
        app.931622e1.js.map
        chunk-vendors.ed4bd0e4.js
        chunk-vendors.ed4bd0e4.js.map

下面把除了 delete.php 外的文件和文件夹全部删除:

PHP代码:

//  要删除的文件
$files = array(
    'favicon.ico',
    'app',
    'css',
    'js'
);

//  删除
$result = delete($files);

这里因为是简单演示,所以就手打文件名了,下面是返回结果:

Array
(
    [0] => favicon.ico
    [1] => app/getimg.json
    [2] => app/imgInfo.json
    [3] => app/server.php
    [4] => app
    [5] => css/app.287096e6.css
    [6] => css/app.2d4a1a45.css
    [7] => css/app.6582a0f0.css
    [8] => css/app.eef9e5aa.css
    [9] => css/chunk-vendors.4f7bf8cd.css
    [10] => css/src/App.vue
    [11] => css/src/assets/logo.png
    [12] => css/src/assets
    [13] => css/src/components/content.vue
    [14] => css/src/components
    [15] => css/src/main.js
    [16] => css/src
    [17] => css
    [18] => js/app.27d4ea4a.js
    [19] => js/app.27d4ea4a.js.map
    [20] => js/app.77d9468e.js
    [21] => js/app.77d9468e.js.map
    [22] => js/app.7d454f08.js
    [23] => js/app.7d454f08.js.map
    [24] => js/app.931622e1.js
    [25] => js/app.931622e1.js.map
    [26] => js/chunk-vendors.ed4bd0e4.js
    [27] => js/chunk-vendors.ed4bd0e4.js.map
    [28] => js
)

上面输出的结果就是已删除的文件和文件夹。

以上就是 PHP 删除文件和文件夹的方法,因为代码比较简单而且很多都有注释,就不逐句说明了。