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

 ID:                 54246
 Updated by:         scott...@php.net
 Reported by:        ebert at woltlab dot com
 Summary:            DirectoryIterator object loses information once
                     copied into a variable
-Status:             Open
+Status:             Bogus
 Type:               Bug
 Package:            Filesystem function related
 Operating System:   Windows 7 x64 (7601 w/ SP1)
 PHP Version:        5.2.17
 Block user comment: N
 Private report:     N

 New Comment:

It's a reference to a single object and as it goes through the loop it's
actually 

off the end making it empty.



If you want a copy use clone.


Previous Comments:
------------------------------------------------------------------------
[2011-03-14 13:48:42] ebert at woltlab dot com

Description:
------------
Storing all DirectoryIterator objects fetched previously with an
instance of DirectoryIterator within an array seems to make stored
objects to lose all data.



While methods like 'isDir()' work fine in first loop, they will always
fail within second loop.



---



C:\Program Files (x86)\PHP>php.exe -v

PHP 5.2.17 (cli) (built: Jan  6 2011 17:37:45)

Copyright (c) 1997-2010 The PHP Group

Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies



---



 Verzeichnis von C:\inetpub\wwwroot\di



14.03.2011  13:33    <DIR>          .

14.03.2011  13:33    <DIR>          ..

14.03.2011  13:41               427 di.php

14.03.2011  13:33    <DIR>          directory

14.03.2011  13:33                 0 randomFile1.txt

14.03.2011  13:33             7.334 randomFile2.odt

14.03.2011  13:33                 0 randomFile3.bmp

               4 Datei(en),          7.761 Bytes

               3 Verzeichnis(se), 23.774.224.384 Bytes frei

Test script:
---------------
<?php

$array = array();

$dir = 'C:/inetpub/wwwroot/di/';



$it = new DirectoryIterator($dir);

foreach ($it as $obj) {

        if ($obj->isDot()) continue;

        var_dump($obj);

        if ($obj->isDir()) echo $obj->getFilename() . ' is a directory.<br
/>';

        else echo $obj->getFilename() . ' is a file<br />';

        

        $array[] = $obj;

}



echo '<hr />';



foreach ($array as $obj) {

        var_dump($obj);

        if ($obj->isDir()) echo $obj->getFilename() . ' is a directory.<br
/>';

        else echo $obj->getFilename() . ' is a file<br />';

}

?>

Actual result:
--------------
object(DirectoryIterator)#1 (0) { } di.php is a file

object(DirectoryIterator)#1 (0) { } directory is a directory.

object(DirectoryIterator)#1 (0) { } randomFile1.txt is a file

object(DirectoryIterator)#1 (0) { } randomFile2.odt is a file

object(DirectoryIterator)#1 (0) { } randomFile3.bmp is a file

(<hr />)

object(DirectoryIterator)#1 (0) { } is a directory.

object(DirectoryIterator)#1 (0) { } is a directory.

object(DirectoryIterator)#1 (0) { } is a directory.

object(DirectoryIterator)#1 (0) { } is a directory.

object(DirectoryIterator)#1 (0) { } is a directory.


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



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

Reply via email to