我想删除一个目录, rmdir
,但是我收到的“目录不为空”的消息,因为它仍然存在文件。
什么功能,我可以用它来删除一个目录中的所有在它以及文件?
我想删除一个目录, rmdir
,但是我收到的“目录不为空”的消息,因为它仍然存在文件。
什么功能,我可以用它来删除一个目录中的所有在它以及文件?
没有内置函数来做到这一点,但看到的评论在底部http://us3.php.net/rmdir 。 一些评论者发表自己的递归目录删除功能。 你可以随意挑选那些。
这里有一个看起来不错的 :
function deleteDirectory($dir) {
if (!file_exists($dir)) {
return true;
}
if (!is_dir($dir)) {
return unlink($dir);
}
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') {
continue;
}
if (!deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) {
return false;
}
}
return rmdir($dir);
}
编辑:您可以只调用rm -rf
如果你想使事情变得简单。 但这使你的脚本UNIX的而已,所以那要小心了。 如果你走这条路我会尝试这样的:
function deleteDirectory($dir) {
system('rm -rf ' . escapeshellarg($dir), $retval);
return $retval == 0; // UNIX commands return zero on success
}
你总是可以尝试使用系统命令。
如果在Linux上使用: rm -rf /dir
如果在Windows上使用: rd c:\dir /S /Q
在上述第(后约翰Kugelman )我想PHP解析器将优化在foreach是SCANDIR但它只是似乎是错误的我有scandir
中foreach
条件语句。
你也可以只做两array_shift
命令来删除.
和..
,而不是总在循环检查。
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);
}
}
在这里我使用:
function emptyDir($dir) {
if (is_dir($dir)) {
$scn = scandir($dir);
foreach ($scn as $files) {
if ($files !== '.') {
if ($files !== '..') {
if (!is_dir($dir . '/' . $files)) {
unlink($dir . '/' . $files);
} else {
emptyDir($dir . '/' . $files);
rmdir($dir . '/' . $files);
}
}
}
}
}
}
$dir = 'link/to/your/dir';
emptyDir($dir);
rmdir($dir);
我的情况下,有和生产“目录不为空”与其他建议的解决方案错误隐藏的文件了不少棘手的目录(包含特殊字符,深度嵌套等名称)。 由于Unix的唯一的解决办法是不可接受的,我测试过,直到我来到了以下解决方案(这在我的情况下,运作良好):
function removeDirectory($path) {
// The preg_replace is necessary in order to traverse certain types of folder paths (such as /dir/[[dir2]]/dir3.abc#/)
// The {,.}* with GLOB_BRACE is necessary to pull all hidden files (have to remove or get "Directory not empty" errors)
$files = glob(preg_replace('/(\*|\?|\[)/', '[$1]', $path).'/{,.}*', GLOB_BRACE);
foreach ($files as $file) {
if ($file == $path.'/.' || $file == $path.'/..') { continue; } // skip special dir entries
is_dir($file) ? removeDirectory($file) : unlink($file);
}
rmdir($path);
return;
}
可没想到的更方便,更有效的方式来做到这一点比这
<?php
$dirname = './myfolder';
if (is_dir($dirname)) {
$dir = new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST ) as $filename => $file) {
if (is_file($filename))
unlink($filename);
else
rmdir($filename);
}
rmdir($dirname); // Now remove myfolder
}
?>
我没有到达删除一个文件夹,因为PHP说我这是不是空的。 但它是。 通过纳曼功能是很好的解决方案来完成我的。 所以这是我使用:
function emptyDir($dir) {
if (is_dir($dir)) {
$scn = scandir($dir);
foreach ($scn as $files) {
if ($files !== '.') {
if ($files !== '..') {
if (!is_dir($dir . '/' . $files)) {
unlink($dir . '/' . $files);
} else {
emptyDir($dir . '/' . $files);
rmdir($dir . '/' . $files);
}
}
}
}
}
}
function deleteDir($dir) {
foreach(glob($dir . '/' . '*') as $file) {
if(is_dir($file)){
deleteDir($file);
} else {
unlink($file);
}
}
emptyDir($dir);
rmdir($dir);
}
因此,要删除目录,以及递归它的内容:
deleteDir($dir);
请尝试以下操作方便的功能:
/**
* Removes directory and its contents
*
* @param string $path Path to the directory.
*/
function _delete_dir($path) {
if (!is_dir($path)) {
throw new InvalidArgumentException("$path must be a directory");
}
if (substr($path, strlen($path) - 1, 1) != DIRECTORY_SEPARATOR) {
$path .= DIRECTORY_SEPARATOR;
}
$files = glob($path . '*', GLOB_MARK);
foreach ($files as $file) {
if (is_dir($file)) {
_delete_dir($file);
} else {
unlink($file);
}
}
rmdir($path);
}
有了这个功能,你就可以删除任何文件或文件夹
function deleteDir($dirPath)
{
if (!is_dir($dirPath)) {
if (file_exists($dirPath) !== false) {
unlink($dirPath);
}
return;
}
if ($dirPath[strlen($dirPath) - 1] != '/') {
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach ($files as $file) {
if (is_dir($file)) {
deleteDir($file);
} else {
unlink($file);
}
}
rmdir($dirPath);
}
从http://php.net/manual/en/function.rmdir.php#91797
水珠函数不返回隐藏的文件,因此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);
}
?>