我在想,删除一个包含所有文件的目录最简单的方法是什么?
我使用 rmdir(PATH . '/' . $value);
删除文件夹,但是,如果里面有文件,我就无法删除它。
现在至少有两个选项可供选择。
在删除文件夹之前,删除其中的所有文件和子文件夹(这意味着需要递归)。以下是一个示例:
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);
}
如果你使用的是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);
.
和..
),并且删除的是解析后的路径,而不是实际路径。 - Alix Axelscandir
函数获取文件夹列表。只需确保从结果列表中过滤掉 '.' 和 '..' 文件即可。 - Joshua - Pendoexplode()
从操作系统获取路径时使用。http://alanhogan.com/tips/php/directory-separator-not-necessary - ReactiveRaven我通常使用以下方法来删除文件夹中的所有文件:
array_map('unlink', glob("$dirname/*.*"));
然后你可以做
rmdir($dirname);
array_map('unlink', glob("$dirname/*"));
这仍然不能删除嵌套在该文件夹内的子目录。 - kremuwaarray_map("unlink", glob("$dirname/*")); array_map("rmdir", glob("$dirname/*")); rmdir($dirname);
。 - Madeorsk最简单的删除带有所有文件的目录的方法是什么?
system("rm -rf ".escapeshellarg($dir));
$dir
是如何生成/提供的,您可能需要进行一些额外的预处理以确保安全并避免错误。例如,如果 $dir
可能包含未转义的空格或分号,则可能会产生不良的副作用。对于使用 rmdir()
等功能的答案,这种情况并不适用,因为它会自动处理特殊字符。 - Trottsystem('rmdir '.escapeshellarg($path).' /s /q');
翻译:在 Windows 系统中,此代码的作用是删除指定路径的文件夹及其内容,同时不提示确认信息。 - Cypher简短的函数可以完成任务:
function deleteDir($path) {
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
我在一个 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);
}
}
伟大的权力伴随着巨大的责任:当您使用一个空值调用此函数时,它将删除以根目录(/
)开头的文件。为了保险起见,您可以检查路径是否为空:
function deleteDir($path) {
if (empty($path)) {
return false;
}
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
$this_func = array(__CLASS__, __FUNCTION__);
,则可以正常工作。 - Matt Connollyarray_map($class_func, glob($path.'/*')) == @rmdir($path)
吗?我猜他是在递归子文件夹,但是 == @rmdir
部分是干什么的? <array of booleans> == <boolean>
是如何返回答案的?它是否检查递归的每个返回值是否与右侧的布尔值相同? - arvimanarray_map(...)
会删除目录中的所有文件,而@rmdir(...)
则会删除目录本身。 - Blaise/
,因此我在我的帖子中添加了一个受保护的版本。 - Blaise如在PHP手册页面关于rmdir()
函数的大多数投票评论中所述(请参见http://php.net/manual/es/function.rmdir.php),glob()
函数不返回隐藏文件。提供了scandir()
作为解决此问题的替代方法。
在那里描述的算法(在我的情况下非常有效)是:
<?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);
}
?>
$file
)是目录还是文件。"$dir/$file"
与$dir . "/" . $file
相同。 - German Latorre(is_dir("$dir/$file") && !is_link("$dir/$file"))
。 - General Redneck// composer require symfony/filesystem
use Symfony\Component\Filesystem\Filesystem;
(new Filesystem)->remove($dir);
$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');
为了完整起见,这里是我旧代码的一个例子:
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);
}
这个版本对我来说很好用。
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);
}
}
您可以尝试以下操作:
/*
* Remove the directory and its content (all files and subdirectories).
* @param string $dir the directory name
*/
function rmrf($dir) {
foreach (glob($dir) as $file) {
if (is_dir($file)) {
rmrf("$file/*");
rmdir($file);
} else {
unlink($file);
}
}
}
shell_exec("rm -rf " . $dir);
如果你担心误删整个文件系统,请确保你的$dir
路径是你想要的。绝对不能允许用户输入能直接删除文件的内容,必须先对输入进行严格的验证。这是编码实践的基本要求。shell_exec("rm -rf " . sys_get_temp_dir() . "/{$dir}");
很容易、直接和非常快速。 - Francisco Luzshell_exec("rm -rf '$dir'");
- Eli Algrantishell_exec()
,但如果您可以的话,这将是一种可行的方法。 - Kerry Johnson这个对我有效:
function removeDirectory($path) {
$files = glob($path . '/*');
foreach ($files as $file) {
is_dir($file) ? removeDirectory($file) : unlink($file);
}
rmdir($path);
return;
}
fclose($create_file);
,在删除时出现了Warning: unlink(created_file.xml): Permission denied in...
。因此,为避免此类错误,必须关闭已创建的文件。 - Andris