PHP:取消链接目录中的所有文件,然后删除该目录

Noo*_*ath 32 php unlink rmdir

我有一种方法可以使用RegExp或通配符搜索快速删除文件夹中的所有文件,然后在PHP中删除该文件夹,不使用"exec"命令?我的服务器没有授权我使用该命令.一个简单的循环就足够了.

我需要一些能够完成以下陈述背后的逻辑的东西,但显然是有效的:


$dir = "/home/dir"
unlink($dir . "/*"); # "*" being a match for all strings
rmdir($dir);

Lus*_*ian 77

使用glob查找匹配模式的所有文件.

function recursiveRemoveDirectory($directory)
{
    foreach(glob("{$directory}/*") as $file)
    {
        if(is_dir($file)) { 
            recursiveRemoveDirectory($file);
        } else {
            unlink($file);
        }
    }
    rmdir($directory);
}
Run Code Online (Sandbox Code Playgroud)

  • 我得到一个错误`达到'100'的最大函数嵌套级别 (2认同)
  • glob 负责隐藏文件吗? (2认同)

Joh*_*nde 17

使用glob()轻松地遍历目录中删除文件,那么你可以删除该目录.

foreach (glob($dir."/*.*") as $filename) {
    if (is_file($filename)) {
        unlink($filename);
    }
}
rmdir($dir);
Run Code Online (Sandbox Code Playgroud)

  • 这段代码很危险,路径应该包含在glob中,就像`glob($ dir."/*.*")`.我尝试了它,它消灭了所有的目录,包括我努力工作的顶级目录 (14认同)

sve*_*ens 9

glob()功能可以满足您的需求.如果您使用的是PHP 5.3+,则可以执行以下操作:

$dir = ...
array_walk(glob($dir . '/*'), function ($fn) {
    if (is_file($fn))
        unlink($fn);
});
unlink($dir);
Run Code Online (Sandbox Code Playgroud)


Aho*_*sik 6

尝试简单方法:

$dir = "/home/dir";
array_map('unlink', glob($dir."/*"));
rmdir($dir);
Run Code Online (Sandbox Code Playgroud)

在删除目录的函数中:

function unlinkr($dir, $pattern = "*") {
        // find all files and folders matching pattern
        $files = glob($dir . "/$pattern"); 
        //interate thorugh the files and folders
        foreach($files as $file){ 
            //if it is a directory then re-call unlinkr function to delete files inside this directory     
            if (is_dir($file) and !in_array($file, array('..', '.')))  {
                unlinkr($file, $pattern);
                //remove the directory itself
                rmdir($file);
                } else if(is_file($file) and ($file != __FILE__)) {
                // make sure you don't delete the current script
                unlink($file); 
            }
        }
        rmdir($dir);
    }

//call following way:
unlinkr("/home/dir");
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量.请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因. (2认同)

Dan*_*jel 5

具体地说,一种简单有效的方法是使用标准PHP库RecursiveIteratorIteratorRecursiveDirectoryIterator递归删除所有文件和文件夹。关键是在RecursiveIteratorIterator::CHILD_FIRST标记中,迭代器将首先循环浏览文件,最后循环浏览目录,因此一旦目录为空,则可以安全使用rmdir()

foreach( new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator( 'folder', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ), 
    RecursiveIteratorIterator::CHILD_FIRST ) as $value ) {
        $value->isFile() ? unlink( $value ) : rmdir( $value );
}

rmdir( 'folder' );
Run Code Online (Sandbox Code Playgroud)