|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2011-08-20 19:56 UTC] php at tracking-celebs dot info
 Description:
------------
After using a DirectoryIterator on a folder, then removing said folder, using another iterator to iterate on the folder's parent will see/try to look into the removed folder.
This only happens on Windows, so maybe due to a cache somewhere or something. Tried adding a clearstatcache() just in case, but that doesn't change anything.
FYI if you replace the first DirectoryIterator by a:
opendir($foo);
without calling closedir() you get the same error, hence why I suggested it might be a handle not (properly) released or something.
Test script:
---------------
<?php
$folder = 'V:\\tmp\\foobar';
if (file_exists($folder)) die("$folder already exists");
if (!mkdir($folder)) die("unable to create $folder");
$foo = $folder . '\\foo';
if (!mkdir($foo)) die("unable to create $foo");
$iterator = new DirectoryIterator($foo);
foreach ($iterator as $fi) { }
unset($iterator);
if (!rmdir($foo)) die("unable to delete $foo");
var_dump(file_exists($foo));
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iterator as $fi) { }
unset($iterator);
if (!rmdir($folder)) die("unable to delete $folder");
Expected result:
----------------
bool(false)
Actual result:
--------------
bool(false)
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(V:\tmp\foobar\foo,V:\tmp\foobar\foo): Access is denied. (code: 5)' in V:\test\test.php on line 35
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Thu Oct 30 03:00:01 2025 UTC | 
Description: ------------ I have same problem, When I calculate size of root folder after delete sub folder error will come. I think Iterator use old reference. Test script: --------------- $rootPath = "C:\public/upload"; $path = "C:\public/upload/New Folder"; // Path to delete folder $Recursive1 = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); // Delete all subfolder foreach ($Recursive1 as $object) { if ($object->isDir()) { rmdir($object->__toString()); } else { unlink($object->__toString()); } } rmdir($path); // Delete this Folder // Calculate root folder size $size = 0 $Recursive2 = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($rootPath, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST ); // Error here foreach($Recursive2 as $object){ $size += is_file($object->getPath()) ? filesize($object->getPath()):0; }