Bug #55468 [Fbk->NoF]: UnexpectedValueException caused by an unreleased handle or something
| From: | cmb@php.net | Date: | Sun, 02 Sep 2018 09:34:44 +0000 |
| Subject: | Bug #55468 [Fbk->NoF]: UnexpectedValueException caused by an unreleased handle or something | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-216849@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=55468&edit=1
ID: 55468
Updated by: cmb@php.net
Reported by: php at tracking-celebs dot info
Summary: UnexpectedValueException caused by an unreleased
handle or something
-Status: Feedback
+Status: No Feedback
Type: Bug
Package: SPL related
Operating System: win32
PHP Version: Irrelevant
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Re-Opened". Thank you.
Previous Comments:
------------------------------------------------------------------------
[2018-08-18 14:10:59] cmb@php.net
I can't reproduce the described behavior. Can anybody else with
any actively supported PHP version[1]?
[1] <http://php.net/supported-versions.php>
------------------------------------------------------------------------
[2012-09-08 14:04:17] sephirot_germany at hotmail dot com
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;
}
------------------------------------------------------------------------
[2011-08-25 00:06:26] php at tracking-celebs dot info
Permissions aren't a problem here.
Besides, the (first, $foo) folder actually gets removed (as indicated by the output of file_exists),
that's not the problem.
And the problem comes before trying to remove the other one ($folder), it is that when calling the
iterator (on that parent), because it'll somehow still "hold"/find a reference to the
now non-existing/freshly removed folder, thus causing the exception...
------------------------------------------------------------------------
[2011-08-22 13:58:59] kalle@php.net
At first glance it doesn't looks like a problem in PHP itself but more that you haven't
granted yourself the permission to delete the folder on Windows.
Have you tried to chmod or similar it?
------------------------------------------------------------------------
[2011-08-20 19:56:20] 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
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=55468&edit=1