PHP unlink()错误:";“目录不为空”;
我使用以下递归方法删除目录及其所有子目录和文件:PHP unlink()错误:";“目录不为空”;,php,Php,我使用以下递归方法删除目录及其所有子目录和文件: protected function _rrmdir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != '.' && $object != '..') { if (filetype($d
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的解决方案。该常量可能会帮助您实现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级别的文件。只有在没有读取权限的情况下,该方法才会返回
FALSE
,请注意,执行所有者需要写入权限才能删除文件。目录中是否有“dotfiles”?(如果不允许php用户查看,这些命令可能不会显示在列表命令中)。对于隐藏文件和.db文件,类似情况也适用于windows。当您试图删除这些文件时,它们可能也在使用中,阻止删除它们,但我怀疑这会引发错误或警告。没有“dotfiles”。下载到文件夹中的文件是图像(主要是JPG)。创建这些文件夹只是为了作为这些图像的临时容器。在文件夹中不做任何其他操作。请尝试更改行if(filetype($dir.'/'.$object)='dir'){
if(is_dir($dir.'/'.$object)){,就像您在方法开始时所做的那样。测试您的代码。记住,问题是间歇性的。感谢您建议使用目录分隔符
和is_file()
。我仍然间歇性地遇到问题(文件夹未被删除)。现在的区别是,我不再收到有关目录不为空的警告。rmdir()一定有问题吗?嗯……操作中的间歇性,可能是因为递归堆栈有时在操作系统实际删除“最后一个文件”之前变为空然后,在文件夹中,当执行堆栈中的顶部元素到达(父文件夹)时,操作系统没有释放指向导致警告的文件的链接。您在哪个操作系统中工作?如果这是真的,可能会得到unlink的响应,如$result=unlink(…)
,或者在unlink命令后有一点睡眠。