ID:               34778
 Updated by:       [EMAIL PROTECTED]
 Reported By:      richard dot quadling at bandvulc dot co dot uk
-Status:           Feedback
+Status:           Bogus
 Bug Type:         SPL related
 Operating System: Windows XP SP2
 PHP Version:      5.0.5
 New Comment:

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Since you are using a CachingIterator and access the type through it
the result is expected.

What happens is that the Caching iterator aggrgates the
DirectoryIterator. So when you access a value from a method of the
Directory iterator it is executed on the DirectoryIteraotr. But the
DirectoryIteraotr has already changed it's state.

To solve this issue, you would need to cache all the information by
deriving the CachingIterator.


Previous Comments:
------------------------------------------------------------------------

[2005-10-07 15:39:25] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip



------------------------------------------------------------------------

[2005-10-07 14:05:18] richard dot quadling at bandvulc dot co dot uk

I altered the code just to show those that are different ...

<?php
class class_DirectoryWalker extends RecursiveIteratorIterator
        {
        function __construct($path)
                {
                parent::__construct(new CachingRecursiveIterator(new
RecursiveDirectoryIterator($path), CIT_CALL_TOSTRING |
CIT_CATCH_GET_CHILD), 1);
                }

        function __call($func, $params)
                {
                return call_user_func_array(array($this->getSubIterator(), 
$func),
$params);
                }
        }

$objDIR = new class_DirectoryWalker('M:/Datastore');

foreach($objDIR as $sKey => &$objValue)
        {
        if (filetype($sKey) != $objValue->getType())
                {
                echo filetype($sKey) . ' ' . $objValue->getType() . " $sKey\n";
                }
        }
?>

and get things like ...

dir file M:/Datastore/Bandvulc Department Desktops/Sales/bij1100
file dir M:/Datastore/Bandvulc Department
Desktops/Sales/bij1100/win2k_xp/english/hpzvip09.dl_

Here we see a directory (filetype()) which the next line is a file
within that directory and that line is being shown as a directory when
in fact it is obviously a folder.

------------------------------------------------------------------------

[2005-10-07 13:41:59] richard dot quadling at bandvulc dot co dot uk

Description:
------------
I'm using SPL RecursiveIteratorIterator, CachingRecursiveIterator and
RecursiveDirectoryIterator to get ALL the files in a directory
structure.

Some of the files are being identied as directories when using
DirectoryIterator::getType() and comparing this to the result of
filetype().



Reproduce code:
---------------
<?php
class class_DirectoryWalker extends RecursiveIteratorIterator
        {
        function __construct($path)
                {
                parent::__construct(new CachingRecursiveIterator(new
RecursiveDirectoryIterator($path), CIT_CALL_TOSTRING |
CIT_CATCH_GET_CHILD), 1);
                }

        function __call($func, $params)
                {
                return call_user_func_array(array($this->getSubIterator(), 
$func),
$params);
                }
        }

$objDIR = new class_DirectoryWalker('M:/Datastore');

foreach($objDIR as $sKey => &$objValue)
        {
        echo filetype($sKey) . ' ' . $objValue->getType() . " $sKey\n";
        }
?>

Expected result:
----------------
dir dir M:/Datastore/Bandvulc Department Desktops
dir dir M:/Datastore/Bandvulc Department Desktops/Accounts
file file M:/Datastore/Bandvulc Department Desktops/Accounts/Shortcut
to ECDL.lnk
dir dir M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Bandvulc Tyre Contracts.lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Salvesen Europe Contacts.lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Sinead Williams on bandsbs.lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Strike Rates 2005.lnk
dir dir M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts/Access Accounts (btc v1).lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts/Access Accounts (btc v2).lnk


Actual result:
--------------
dir dir M:/Datastore/Bandvulc Department Desktops
dir dir M:/Datastore/Bandvulc Department Desktops/Accounts
file dir M:/Datastore/Bandvulc Department Desktops/Accounts/Shortcut to
ECDL.lnk
dir dir M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Bandvulc Tyre Contracts.lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Salvesen Europe Contacts.lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Sinead Williams on bandsbs.lnk
file dir M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Shortcut to Strike Rates 2005.lnk
dir dir M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts/Access Accounts (btc v1).lnk
file file M:/Datastore/Bandvulc Department Desktops/Bandvulc Tyre
Contracts/Unused Desktop Shortcuts/Access Accounts (btc v2).lnk



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=34778&edit=1

Reply via email to