我有以下递归方法来删除目录及其所有子目录和文件:
protected 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);
}
}
有时会收到警告,"目录不为空" 。
该目录实际上是作为文件的临时持有者创建的。使用以下代码段从Internet下载文件:
file_put_contents($filename, file_get_contents($file))
下载(写入操作)后,将它们上传到网站(读取操作)。完成上传后,临时文件夹及其文件将被删除。
奇怪的是,当我查看临时文件夹时,那里没有文件。好像代码在最后一个文件被删除的过程中试图删除该文件夹?
任何想法可能有什么问题以及如何解决?我需要这个代码在Windows和* nix上运行,所以只有* nix解决方案不是一个选项。
答案 0 :(得分:1)
常量DIRECTORY_SEPARATOR可能会帮助您兼容Windows / Unix。 对于非空文件夹,请尝试以下操作:
protected function _rrmdir($dir)
{
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != '.' && $object != '..') {
if (is_dir($dir . DIRECTORY_SEPARATOR . $object)) {
_rrmdir($dir . DIRECTORY_SEPARATOR . $object);
} else {
if( is_file($dir . DIRECTORY_SEPARATOR . $object) ) {
if(!unlink($dir . DIRECTORY_SEPARATOR . $object)) {
// code in case the file was not removed
}
// wait a bit here?
} else {
// code for debug file permission issues
}
}
}
}
reset($objects);
rmdir($dir);
}
}
您可能会尝试删除权限不在php exec级别的文件
仅当没有读取权限时,is_file()方法才会返回FALSE
,请注意执行所有者需要写入权限才能删除文件。