我有一段代码用于测试一个目录是否存在,如果它存在则删除它,并在其上创建一个新目录。它应该相当简单。PHP mkdir无法在rmdir之后工作
if(is_dir($directory)){
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory,RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach($files as $fileinfo){
$todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
$todo($fileinfo->getRealPath());
}
rmdir($directory);
//var_dump(is_dir($directory));
}
clearstatcache();
mkdir($directory,0744);
如果该目录还不存在,mkdir()
工作得很好。但是,如果该目录不存在,rmdir()
环,它的工作,但PHP抛出一个错误:
PHP Error[2]: mkdir(): Permission Denied
的评论var_dump()
行让我发现,PHP仍然认为$directory
是连rmdir()
电话后的目录。所以我使用clearstatcache()
来更新它,但它仍然不会检测到目录已被删除。当我在文件系统中查找它时,该目录实际上已被删除。
如果我再次运行脚本(而目录不见了),它工作得很好。
任何人都可以弄清楚如何解决这个错误?如果它有所作为,我将它作为我的Win7/XAMPP开发环境中的PHP命令行脚本运行。
编辑:
感谢Wee Kiat和Phillip的回答。解决方法是在rmdir()
之前使用unset($files)
来关闭递归迭代器,该递归迭代器仍然保持$directory
打开并导致mkdir()
呛。请参阅下面的代码。
“权限被拒绝”是一个明确的错误 – 2012-07-16 22:26:46
如果您传递给'clearstatcache();'?你可以把'var_dump(is_dir());'直接放在'mkdir()'之前吗? – nickb 2012-07-16 22:34:00
@ Dagon - 在这种情况下,拒绝权限不明确,因为它只给出错误的50%的时间。 @nickb - 在'clearstatcache()'之前或之后,'var_dump()'在两个位置给出相同的输出。看起来'clearstatcache()'没有做任何事情。 – penco 2012-07-16 23:19:53