我有一段代碼用於測試一個目錄是否存在,如果它存在則刪除它,並在其上創建一個新目錄。它應該相當簡單。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