I wonder, what's the easiest way to delete a directory with all its files in it?
我想知道,删除包含所有文件的目录最简单的方法是什么?
I'm using rmdir(PATH . '/' . $value);
to delete a folder, however, if there are files inside of it, I simply can't delete it.
我用删除路径(路径。“/”。美元价值);但是,要删除一个文件夹,如果里面有文件,我就不能删除它。
29 个解决方案
#1
279
There are at least two options available nowdays.
现在至少有两个选择。
-
Before deleting the folder, delete all it's files and folders (and this means recursion!). Here is an example:
在删除文件夹之前,删除它的所有文件和文件夹(这意味着递归!)这是一个例子:
public static function deleteDir($dirPath) { if (! is_dir($dirPath)) { throw new InvalidArgumentException("$dirPath must be a directory"); } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } $files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) { if (is_dir($file)) { self::deleteDir($file); } else { unlink($file); } } rmdir($dirPath); }
-
And if you are using 5.2+ you can use a RecursiveIterator to do it without needing to do the recursion yourself:
如果您正在使用5.2+,您可以使用一个RecursiveIterator来实现它,而不需要自己进行递归:
$dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree'; $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach($files as $file) { if ($file->isDir()){ rmdir($file->getRealPath()); } else { unlink($file->getRealPath()); } } rmdir($dir);
#2
148
I generally use this to delete all files in a folder:
我通常用它来删除文件夹中的所有文件:
array_map('unlink', glob("$dirname/*.*"));
And then you can do
然后你可以这么做
rmdir($dirname);
#3
68
what's the easiest way to delete a directory with all it's files in it?
删除目录中所有文件的最简单方法是什么?
system("rm -rf ".escapeshellarg($dir));
#4
44
Short function that does the job:
完成工作的短功能:
function deleteDir($path) {
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
I use it in a Utils class like this:
我在Utils类中使用如下:
class Utils {
public static function deleteDir($path) {
$class_func = array(__CLASS__, __FUNCTION__);
return is_file($path) ?
@unlink($path) :
array_map($class_func, glob($path.'/*')) == @rmdir($path);
}
}
With great power comes great responsibility: When you call this function with an empty value, it will delete files starting in root (/
). As a safeguard you can check if path is empty:
强大的功能带来了巨大的责任:当你用空值调用这个函数时,它会删除从root(/)开始的文件。作为保障,你可以检查路径是否为空:
function deleteDir($path) {
if (empty($path)) {
return false;
}
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
#5
18
This is a shorter Version works great to me
这个较短的版本对我来说很好
function deleteDirectory($dirPath) {
if (is_dir($dirPath)) {
$objects = scandir($dirPath);
foreach ($objects as $object) {
if ($object != "." && $object !="..") {
if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
} else {
unlink($dirPath . DIRECTORY_SEPARATOR . $object);
}
}
}
reset($objects);
rmdir($dirPath);
}
}
#6
11
As seen in most voted comment on PHP manual page about rmdir()
(see http://php.net/manual/es/function.rmdir.php), glob()
function does not return hidden files. scandir()
is provided as an alternative that solves that issue.
在关于rmdir()的PHP手册页面(请参见http://php.net/manual/es/function.rmdir.php)上的大多数投票评论中可以看到,glob()函数不返回隐藏文件。提供scandir()作为解决该问题的备选方案。
Algorithm described there (which worked like a charm in my case) is:
这里描述的算法(在我的例子中就像魔法一样)是:
<?php
function delTree($dir)
{
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
?>
#7
7
Here you have one nice and simple recursion for deleting all files in source directory including that directory:
这里有一个简单的递归,用于删除源目录中的所有文件,包括该目录:
function delete_dir($src) {
$dir = opendir($src);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
delete_dir($src . '/' . $file);
}
else {
unlink($src . '/' . $file);
}
}
}
closedir($dir);
rmdir($src);
}
Function is based on recursion made for copying directory. You can find that function here: Copy entire contents of a directory to another using php
函数基于复制目录的递归。您可以在这里找到这个函数:使用php将目录的整个内容复制到另一个目录
#8
7
You may use Symfony's Filesystem (code):
您可以使用Symfony的文件系统(代码):
// composer require symfony/filesystem
use Symfony\Component\Filesystem\Filesystem;
(new Filesystem)->remove($dir);
However I couldn't delete some complex directory structures with this method, so first you should try it to ensure it's working properly.
但是我不能用这个方法删除一些复杂的目录结构,所以首先您应该尝试它以确保它正常工作。
I could delete the said directory structure using a Windows specific implementation:
我可以使用Windows特定的实现删除上述目录结构:
$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');
And just for the sake of completeness, here is an old code of mine:
为了完整性起见,这里有一个我的旧代码:
function xrmdir($dir) {
$items = scandir($dir);
foreach ($items as $item) {
if ($item === '.' || $item === '..') {
continue;
}
$path = $dir.'/'.$item;
if (is_dir($path)) {
xrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
#9
3
I prefer this because it still returns TRUE when it succeeds and FALSE when it fails, and it also prevents a bug where an empty path might try and delete everything from '/*' !!:
我更喜欢这个,因为当它成功时它仍然返回TRUE,当它失败时它返回FALSE,并且它还可以防止一个空路径试图从'/*'中删除所有内容的错误!
function deleteDir($path)
{
return !empty($path) && is_file($path) ?
@unlink($path) :
(array_reduce(glob($path.'/*'), function ($r, $i) { return $r && deleteDir($i); }, TRUE)) && @rmdir($path);
}
#10
3
What about this:
这个:
function recursiveDelete($dirPath, $deleteParent = true){
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
$path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
}
if($deleteParent) rmdir($dirPath);
}
#11
3
Glob function doesn't return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.
Glob函数不返回隐藏的文件,因此当尝试递归地删除树时,scandir可能更有用。
<?php
public static function delTree($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
?>
#12
2
Litle bit modify of alcuadrado's code - glob
don't see files with name from points like .htaccess
so I use scandir and script deletes itself - check __FILE__
.
Litle bit修改了alcuadrado的代码——glob不从点(比如.htaccess)看到文件名的文件,所以我使用scandir并删除脚本——检查__FILE__。
function deleteDir($dirPath) {
if (!is_dir($dirPath)) {
throw new InvalidArgumentException("$dirPath must be a directory");
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
$files = scandir($dirPath);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
if (is_dir($dirPath.$file)) {
deleteDir($dirPath.$file);
} else {
if ($dirPath.$file !== __FILE__) {
unlink($dirPath.$file);
}
}
}
rmdir($dirPath);
}
#13
2
The Best Solution for me
对我来说最好的解决办法
my_folder_delete("../path/folder");
code:
代码:
function my_folder_delete($path) {
if(!empty($path) && is_dir($path) ){
$dir = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs are not included,otherwise DISASTER HAPPENS :)
$files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $f) {if (is_file($f)) {unlink($f);} else {$empty_dirs[] = $f;} } if (!empty($empty_dirs)) {foreach ($empty_dirs as $eachDir) {rmdir($eachDir);}} rmdir($path);
}
}
p.s. REMEMBER!
dont pass EMPTY VALUES to any Directory deleting functions!!! (backup them always, otherwise one day you might get DISASTER!!)
注。记住!不要将空值传递给任何删除函数的目录!!(随时备份,否则有一天你可能会遭遇灾难!)
#14
2
I want to expand on the answer by @alcuadrado with the comment by @Vijit for handling symlinks. Firstly, use getRealPath(). But then, if you have any symlinks that are folders it will fail as it will try and call rmdir on a link - so you need an extra check.
我想扩展@alcuadrado的答案,使用@Vijit处理符号链接的注释。首先,使用getRealPath()。但是,如果您有任何作为文件夹的符号链接,它将失败,因为它将尝试在一个链接上调用rmdir——因此您需要额外的检查。
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
if ($file->isLink()) {
unlink($file->getPathname());
} else if ($file->isDir()){
rmdir($file->getPathname());
} else {
unlink($file->getPathname());
}
}
rmdir($dir);
#15
1
Something like this?
是这样的吗?
function delete_folder($folder) {
$glob = glob($folder);
foreach ($glob as $g) {
if (!is_dir($g)) {
unlink($g);
} else {
delete_folder("$g/*");
rmdir($g);
}
}
}
#16
1
Delete all files in Folderarray_map('unlink', glob("$directory/*.*"));
Delete all .*-Files in Folder (without: "." and "..")array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
Now delete the Folder itselfrmdir($directory)
删除文件夹array_map中的所有文件(“unlink”,glob(“$directory/*.*”));删除文件夹中的所有.*-文件(没有:"."和".")array_map('unlink', array_diff($directory/.*),数组("$directory/.","$directory/. ")))
#17
1
2 cents to add to THIS answer above, which is great BTW
在上面的答案上再加2分,这很好
After your glob (or similar) function has scanned/read the directory, add a conditional to check the response is not empty, or an invalid argument supplied for foreach()
warning will be thrown. So...
在您的glob(或类似的)函数扫描/读取目录之后,添加一个条件来检查响应不是空的,或者为foreach()警告提供的无效参数将被抛出。所以…
if( ! empty( $files ) )
{
foreach( $files as $file )
{
// do your stuff here...
}
}
My full function (as an object method):
我的全部功能(作为对象方法):
private function recursiveRemoveDirectory( $directory )
{
if( ! is_dir( $directory ) )
{
throw new InvalidArgumentException( "$directory must be a directory" );
}
if( substr( $directory, strlen( $directory ) - 1, 1 ) != '/' )
{
$directory .= '/';
}
$files = glob( $directory . "*" );
if( ! empty( $files ) )
{
foreach( $files as $file )
{
if( is_dir( $file ) )
{
$this->recursiveRemoveDirectory( $file );
}
else
{
unlink( $file );
}
}
}
rmdir( $directory );
} // END recursiveRemoveDirectory()
#18
1
Using DirectoryIterator an equivalent of a previous answer…
使用DirectoryIterator相当于以前的答案……
function deleteFolder($rootPath)
{
foreach(new DirectoryIterator($rootPath) as $fileToDelete)
{
if($fileToDelete->isDot()) continue;
if ($fileToDelete->isFile())
unlink($fileToDelete->getPathName());
if ($fileToDelete->isDir())
deleteFolder($fileToDelete->getPathName());
}
rmdir($rootPath);
}
#19
0
<?php
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir")
rrmdir($dir."/".$object);
else unlink ($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
?>
Have your tryed out the obove code from php.net
你是否从php。net中试过obove代码
Work for me fine
为我工作好
#20
0
For windows:
windows:
system("rmdir ".escapeshellarg($path) . " /s /q");
#21
0
Like Playnox's solution, but with the elegant built-in DirectoryIterator:
就像Playnox的解决方案一样,但是使用了优雅的内置DirectoryIterator:
function delete_directory($dirPath){
if(is_dir($dirPath)){
$objects=new DirectoryIterator($dirPath);
foreach ($objects as $object){
if(!$object->isDot()){
if($object->isDir()){
delete_directory($object->getPathname());
}else{
unlink($object->getPathname());
}
}
}
rmdir($dirPath);
}else{
throw new Exception(__FUNCTION__.'(dirPath): dirPath is not a directory!');
}
}
#22
0
I do not remember from where I copied this function, but it looks like it is not listed and it is working for me
我不记得从哪里复制了这个函数,但是看起来它没有被列出,而且它对我很有用
function rm_rf($path) {
if (@is_dir($path) && is_writable($path)) {
$dp = opendir($path);
while ($ent = readdir($dp)) {
if ($ent == '.' || $ent == '..') {
continue;
}
$file = $path . DIRECTORY_SEPARATOR . $ent;
if (@is_dir($file)) {
rm_rf($file);
} elseif (is_writable($file)) {
unlink($file);
} else {
echo $file . "is not writable and cannot be removed. Please fix the permission or select a new path.\n";
}
}
closedir($dp);
return rmdir($path);
} else {
return @unlink($path);
}
}
#23
0
Simple and Easy...
简单和容易的……
$dir ='pathtodir';
if (is_dir($dir)) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if ($filename->isDir()) continue;
unlink($filename);
}
rmdir($dir);
}
#24
0
Example for the Linux server: exec('rm -f -r ' . $cache_folder . '/*');
Linux服务器的示例:exec(“rm -f -r”)。cache_folder美元。“/ *”);
#25
0
Here is the solution that works perfect:
这里有一个完美的解决方案:
function unlink_r($from) {
if (!file_exists($from)) {return false;}
$dir = opendir($from);
while (false !== ($file = readdir($dir))) {
if ($file == '.' OR $file == '..') {continue;}
if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
unlink_r($from . DIRECTORY_SEPARATOR . $file);
}
else {
unlink($from . DIRECTORY_SEPARATOR . $file);
}
}
rmdir($from);
closedir($dir);
return true;
}
#26
0
What about this?
这是什么?
function Delete_Directory($Dir)
{
if(is_dir($Dir))
{
$files = glob( $Dir . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
foreach( $files as $file )
{
Delete_Directory( $file );
}
if(file_exists($Dir))
{
rmdir($Dir);
}
}
elseif(is_file($Dir))
{
unlink( $Dir );
}
}
Refrence: https://paulund.co.uk/php-delete-directory-and-files-in-directory
具有:https://paulund.co.uk/php-delete-directory-and-files-in-directory
#27
0
This one works for me:
这个对我很有用:
function removeDirectory($path) {
$files = glob($path . '/*');
foreach ($files as $file) {
is_dir($file) ? removeDirectory($file) : unlink($file);
}
rmdir($path);
return;
}
#28
-2
Here is a simple solution
这里有一个简单的解决方案
$dirname = $_POST['d'];
$folder_handler = dir($dirname);
while ($file = $folder_handler->read()) {
if ($file == "." || $file == "..")
continue;
unlink($dirname.'/'.$file);
}
$folder_handler->close();
rmdir($dirname);
#29
-4
Platform independent code.
平台无关的代码。
Took the answer from PHP.net
从php。net中得到答案
if(PHP_OS === 'Windows')
{
exec("rd /s /q {$path}");
}
else
{
exec("rm -rf {$path}");
}
#1
279
There are at least two options available nowdays.
现在至少有两个选择。
-
Before deleting the folder, delete all it's files and folders (and this means recursion!). Here is an example:
在删除文件夹之前,删除它的所有文件和文件夹(这意味着递归!)这是一个例子:
public static function deleteDir($dirPath) { if (! is_dir($dirPath)) { throw new InvalidArgumentException("$dirPath must be a directory"); } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } $files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) { if (is_dir($file)) { self::deleteDir($file); } else { unlink($file); } } rmdir($dirPath); }
-
And if you are using 5.2+ you can use a RecursiveIterator to do it without needing to do the recursion yourself:
如果您正在使用5.2+,您可以使用一个RecursiveIterator来实现它,而不需要自己进行递归:
$dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree'; $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach($files as $file) { if ($file->isDir()){ rmdir($file->getRealPath()); } else { unlink($file->getRealPath()); } } rmdir($dir);
#2
148
I generally use this to delete all files in a folder:
我通常用它来删除文件夹中的所有文件:
array_map('unlink', glob("$dirname/*.*"));
And then you can do
然后你可以这么做
rmdir($dirname);
#3
68
what's the easiest way to delete a directory with all it's files in it?
删除目录中所有文件的最简单方法是什么?
system("rm -rf ".escapeshellarg($dir));
#4
44
Short function that does the job:
完成工作的短功能:
function deleteDir($path) {
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
I use it in a Utils class like this:
我在Utils类中使用如下:
class Utils {
public static function deleteDir($path) {
$class_func = array(__CLASS__, __FUNCTION__);
return is_file($path) ?
@unlink($path) :
array_map($class_func, glob($path.'/*')) == @rmdir($path);
}
}
With great power comes great responsibility: When you call this function with an empty value, it will delete files starting in root (/
). As a safeguard you can check if path is empty:
强大的功能带来了巨大的责任:当你用空值调用这个函数时,它会删除从root(/)开始的文件。作为保障,你可以检查路径是否为空:
function deleteDir($path) {
if (empty($path)) {
return false;
}
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
#5
18
This is a shorter Version works great to me
这个较短的版本对我来说很好
function deleteDirectory($dirPath) {
if (is_dir($dirPath)) {
$objects = scandir($dirPath);
foreach ($objects as $object) {
if ($object != "." && $object !="..") {
if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
} else {
unlink($dirPath . DIRECTORY_SEPARATOR . $object);
}
}
}
reset($objects);
rmdir($dirPath);
}
}
#6
11
As seen in most voted comment on PHP manual page about rmdir()
(see http://php.net/manual/es/function.rmdir.php), glob()
function does not return hidden files. scandir()
is provided as an alternative that solves that issue.
在关于rmdir()的PHP手册页面(请参见http://php.net/manual/es/function.rmdir.php)上的大多数投票评论中可以看到,glob()函数不返回隐藏文件。提供scandir()作为解决该问题的备选方案。
Algorithm described there (which worked like a charm in my case) is:
这里描述的算法(在我的例子中就像魔法一样)是:
<?php
function delTree($dir)
{
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
?>
#7
7
Here you have one nice and simple recursion for deleting all files in source directory including that directory:
这里有一个简单的递归,用于删除源目录中的所有文件,包括该目录:
function delete_dir($src) {
$dir = opendir($src);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
delete_dir($src . '/' . $file);
}
else {
unlink($src . '/' . $file);
}
}
}
closedir($dir);
rmdir($src);
}
Function is based on recursion made for copying directory. You can find that function here: Copy entire contents of a directory to another using php
函数基于复制目录的递归。您可以在这里找到这个函数:使用php将目录的整个内容复制到另一个目录
#8
7
You may use Symfony's Filesystem (code):
您可以使用Symfony的文件系统(代码):
// composer require symfony/filesystem
use Symfony\Component\Filesystem\Filesystem;
(new Filesystem)->remove($dir);
However I couldn't delete some complex directory structures with this method, so first you should try it to ensure it's working properly.
但是我不能用这个方法删除一些复杂的目录结构,所以首先您应该尝试它以确保它正常工作。
I could delete the said directory structure using a Windows specific implementation:
我可以使用Windows特定的实现删除上述目录结构:
$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');
And just for the sake of completeness, here is an old code of mine:
为了完整性起见,这里有一个我的旧代码:
function xrmdir($dir) {
$items = scandir($dir);
foreach ($items as $item) {
if ($item === '.' || $item === '..') {
continue;
}
$path = $dir.'/'.$item;
if (is_dir($path)) {
xrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
#9
3
I prefer this because it still returns TRUE when it succeeds and FALSE when it fails, and it also prevents a bug where an empty path might try and delete everything from '/*' !!:
我更喜欢这个,因为当它成功时它仍然返回TRUE,当它失败时它返回FALSE,并且它还可以防止一个空路径试图从'/*'中删除所有内容的错误!
function deleteDir($path)
{
return !empty($path) && is_file($path) ?
@unlink($path) :
(array_reduce(glob($path.'/*'), function ($r, $i) { return $r && deleteDir($i); }, TRUE)) && @rmdir($path);
}
#10
3
What about this:
这个:
function recursiveDelete($dirPath, $deleteParent = true){
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
$path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
}
if($deleteParent) rmdir($dirPath);
}
#11
3
Glob function doesn't return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.
Glob函数不返回隐藏的文件,因此当尝试递归地删除树时,scandir可能更有用。
<?php
public static function delTree($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
?>
#12
2
Litle bit modify of alcuadrado's code - glob
don't see files with name from points like .htaccess
so I use scandir and script deletes itself - check __FILE__
.
Litle bit修改了alcuadrado的代码——glob不从点(比如.htaccess)看到文件名的文件,所以我使用scandir并删除脚本——检查__FILE__。
function deleteDir($dirPath) {
if (!is_dir($dirPath)) {
throw new InvalidArgumentException("$dirPath must be a directory");
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
$files = scandir($dirPath);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
if (is_dir($dirPath.$file)) {
deleteDir($dirPath.$file);
} else {
if ($dirPath.$file !== __FILE__) {
unlink($dirPath.$file);
}
}
}
rmdir($dirPath);
}
#13
2
The Best Solution for me
对我来说最好的解决办法
my_folder_delete("../path/folder");
code:
代码:
function my_folder_delete($path) {
if(!empty($path) && is_dir($path) ){
$dir = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs are not included,otherwise DISASTER HAPPENS :)
$files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $f) {if (is_file($f)) {unlink($f);} else {$empty_dirs[] = $f;} } if (!empty($empty_dirs)) {foreach ($empty_dirs as $eachDir) {rmdir($eachDir);}} rmdir($path);
}
}
p.s. REMEMBER!
dont pass EMPTY VALUES to any Directory deleting functions!!! (backup them always, otherwise one day you might get DISASTER!!)
注。记住!不要将空值传递给任何删除函数的目录!!(随时备份,否则有一天你可能会遭遇灾难!)
#14
2
I want to expand on the answer by @alcuadrado with the comment by @Vijit for handling symlinks. Firstly, use getRealPath(). But then, if you have any symlinks that are folders it will fail as it will try and call rmdir on a link - so you need an extra check.
我想扩展@alcuadrado的答案,使用@Vijit处理符号链接的注释。首先,使用getRealPath()。但是,如果您有任何作为文件夹的符号链接,它将失败,因为它将尝试在一个链接上调用rmdir——因此您需要额外的检查。
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
if ($file->isLink()) {
unlink($file->getPathname());
} else if ($file->isDir()){
rmdir($file->getPathname());
} else {
unlink($file->getPathname());
}
}
rmdir($dir);
#15
1
Something like this?
是这样的吗?
function delete_folder($folder) {
$glob = glob($folder);
foreach ($glob as $g) {
if (!is_dir($g)) {
unlink($g);
} else {
delete_folder("$g/*");
rmdir($g);
}
}
}
#16
1
Delete all files in Folderarray_map('unlink', glob("$directory/*.*"));
Delete all .*-Files in Folder (without: "." and "..")array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
Now delete the Folder itselfrmdir($directory)
删除文件夹array_map中的所有文件(“unlink”,glob(“$directory/*.*”));删除文件夹中的所有.*-文件(没有:"."和".")array_map('unlink', array_diff($directory/.*),数组("$directory/.","$directory/. ")))
#17
1
2 cents to add to THIS answer above, which is great BTW
在上面的答案上再加2分,这很好
After your glob (or similar) function has scanned/read the directory, add a conditional to check the response is not empty, or an invalid argument supplied for foreach()
warning will be thrown. So...
在您的glob(或类似的)函数扫描/读取目录之后,添加一个条件来检查响应不是空的,或者为foreach()警告提供的无效参数将被抛出。所以…
if( ! empty( $files ) )
{
foreach( $files as $file )
{
// do your stuff here...
}
}
My full function (as an object method):
我的全部功能(作为对象方法):
private function recursiveRemoveDirectory( $directory )
{
if( ! is_dir( $directory ) )
{
throw new InvalidArgumentException( "$directory must be a directory" );
}
if( substr( $directory, strlen( $directory ) - 1, 1 ) != '/' )
{
$directory .= '/';
}
$files = glob( $directory . "*" );
if( ! empty( $files ) )
{
foreach( $files as $file )
{
if( is_dir( $file ) )
{
$this->recursiveRemoveDirectory( $file );
}
else
{
unlink( $file );
}
}
}
rmdir( $directory );
} // END recursiveRemoveDirectory()
#18
1
Using DirectoryIterator an equivalent of a previous answer…
使用DirectoryIterator相当于以前的答案……
function deleteFolder($rootPath)
{
foreach(new DirectoryIterator($rootPath) as $fileToDelete)
{
if($fileToDelete->isDot()) continue;
if ($fileToDelete->isFile())
unlink($fileToDelete->getPathName());
if ($fileToDelete->isDir())
deleteFolder($fileToDelete->getPathName());
}
rmdir($rootPath);
}
#19
0
<?php
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir")
rrmdir($dir."/".$object);
else unlink ($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
?>
Have your tryed out the obove code from php.net
你是否从php。net中试过obove代码
Work for me fine
为我工作好
#20
0
For windows:
windows:
system("rmdir ".escapeshellarg($path) . " /s /q");
#21
0
Like Playnox's solution, but with the elegant built-in DirectoryIterator:
就像Playnox的解决方案一样,但是使用了优雅的内置DirectoryIterator:
function delete_directory($dirPath){
if(is_dir($dirPath)){
$objects=new DirectoryIterator($dirPath);
foreach ($objects as $object){
if(!$object->isDot()){
if($object->isDir()){
delete_directory($object->getPathname());
}else{
unlink($object->getPathname());
}
}
}
rmdir($dirPath);
}else{
throw new Exception(__FUNCTION__.'(dirPath): dirPath is not a directory!');
}
}
#22
0
I do not remember from where I copied this function, but it looks like it is not listed and it is working for me
我不记得从哪里复制了这个函数,但是看起来它没有被列出,而且它对我很有用
function rm_rf($path) {
if (@is_dir($path) && is_writable($path)) {
$dp = opendir($path);
while ($ent = readdir($dp)) {
if ($ent == '.' || $ent == '..') {
continue;
}
$file = $path . DIRECTORY_SEPARATOR . $ent;
if (@is_dir($file)) {
rm_rf($file);
} elseif (is_writable($file)) {
unlink($file);
} else {
echo $file . "is not writable and cannot be removed. Please fix the permission or select a new path.\n";
}
}
closedir($dp);
return rmdir($path);
} else {
return @unlink($path);
}
}
#23
0
Simple and Easy...
简单和容易的……
$dir ='pathtodir';
if (is_dir($dir)) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
if ($filename->isDir()) continue;
unlink($filename);
}
rmdir($dir);
}
#24
0
Example for the Linux server: exec('rm -f -r ' . $cache_folder . '/*');
Linux服务器的示例:exec(“rm -f -r”)。cache_folder美元。“/ *”);
#25
0
Here is the solution that works perfect:
这里有一个完美的解决方案:
function unlink_r($from) {
if (!file_exists($from)) {return false;}
$dir = opendir($from);
while (false !== ($file = readdir($dir))) {
if ($file == '.' OR $file == '..') {continue;}
if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
unlink_r($from . DIRECTORY_SEPARATOR . $file);
}
else {
unlink($from . DIRECTORY_SEPARATOR . $file);
}
}
rmdir($from);
closedir($dir);
return true;
}
#26
0
What about this?
这是什么?
function Delete_Directory($Dir)
{
if(is_dir($Dir))
{
$files = glob( $Dir . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
foreach( $files as $file )
{
Delete_Directory( $file );
}
if(file_exists($Dir))
{
rmdir($Dir);
}
}
elseif(is_file($Dir))
{
unlink( $Dir );
}
}
Refrence: https://paulund.co.uk/php-delete-directory-and-files-in-directory
具有:https://paulund.co.uk/php-delete-directory-and-files-in-directory
#27
0
This one works for me:
这个对我很有用:
function removeDirectory($path) {
$files = glob($path . '/*');
foreach ($files as $file) {
is_dir($file) ? removeDirectory($file) : unlink($file);
}
rmdir($path);
return;
}
#28
-2
Here is a simple solution
这里有一个简单的解决方案
$dirname = $_POST['d'];
$folder_handler = dir($dirname);
while ($file = $folder_handler->read()) {
if ($file == "." || $file == "..")
continue;
unlink($dirname.'/'.$file);
}
$folder_handler->close();
rmdir($dirname);
#29
-4
Platform independent code.
平台无关的代码。
Took the answer from PHP.net
从php。net中得到答案
if(PHP_OS === 'Windows')
{
exec("rd /s /q {$path}");
}
else
{
exec("rm -rf {$path}");
}