Bug #80056 [Fbk->Opn]: missing files when using `foreach` to iterate `RecursiveDirectoryIterator`
| From: | cmb@php.net | Date: | Mon, 07 Sep 2020 07:15:59 +0000 |
| Subject: | Bug #80056 [Fbk->Opn]: missing files when using `foreach` to iterate `RecursiveDirectoryIterator` | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-228914@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=80056&edit=1
ID: 80056
Updated by: cmb@php.net
Reported by: 397836525 at qq dot com
Summary: missing files when using
foreach to iterate
RecursiveDirectoryIterator
-Status: Feedback
+Status: Open
Type: Bug
Package: *Directory/Filesystem functions
Operating System: Windows
PHP Version: 7.4.10
-Assigned To: cmb
+Assigned To:
Block user comment: N
Private report: N
New Comment:
For some reason I missed that script. Anyhow, I cannot reproduce
the issue with that script. All six methods return the expected
65.
Previous Comments:
------------------------------------------------------------------------
[2020-09-04 08:23:25] 397836525 at qq dot com
Somehow I cannot upload my test code by using patch file.So I paste the test code in the previos
comment.please check.
------------------------------------------------------------------------
[2020-09-04 08:15:00] cmb@php.net
I cannot reproduce the reported behavior.
> please use the patch file to reproduce the bug.
Not sure if you tried to add some file as patch, but that won't
necessarily work. Please make such scripts publicly available
somewhere else (e.g. gist.github.com, pastebin.com), and share the
link here.
------------------------------------------------------------------------
[2020-09-04 08:08:44] 397836525 at qq dot com
here's the code for reproducing the bug.
<?php
/**
* Created by RexMin.
* Description.
* Email: rexmin@futunn.com
* Date: 2020/9/4
* Time: 14:40
*/
class Test
{
protected $path = 'directory';
public function createTestFiles ()
{
$amount = 63;
if (!is_dir($this->path)) {
mkdir($this->path);
}
foreach (scandir($this->path) as $filename) {
@unlink("{$this->path}/$filename");
}
for ($num = 1; $num <= $amount; $num++) {
fopen("{$this->path}/{$num}.txt", "a");
}
}
public function runTest()
{
echo 'get by foreach: ' . $this->getByForeach() . PHP_EOL;
echo 'get by foreach with rewind: ' . $this->getByForeachWithRewind() .
PHP_EOL;
echo 'get by foreach after foreach: ' . $this->getByForeachAfterForeach() .
PHP_EOL;
echo 'get by loop: ' . $this->getByloop() . PHP_EOL;
echo 'get by iterator_to_array: ' . $this->getByIteratorToArray() . PHP_EOL;
echo 'get by iterator_to_array with rewind: ' .
$this->getByIteratorToArrayWithRewind() . PHP_EOL;
}
public function getByForeach()
{
$directory = new RecursiveDirectoryIterator($this->path);
$count = 0;
foreach ($directory as $filename => $fileInfo) {
$count++;
}
return $count;
}
public function getByForeachWithRewind()
{
$directory = new RecursiveDirectoryIterator($this->path);
$count = 0;
$directory->rewind();
foreach ($directory as $filename => $fileInfo) {
$count++;
}
return $count;
}
public function getByForeachAfterForeach()
{
$directory = new RecursiveDirectoryIterator($this->path);
$count = 0;
foreach ($directory as $filename => $fileInfo) {
// do nothing
}
foreach ($directory as $filename => $fileInfo) {
$count++;
}
return $count;
}
public function getByLoop()
{
$directory = new RecursiveDirectoryIterator($this->path);
$count = 0;
while ($directory->valid()) {
$count++;
$directory->next();
}
return $count;
}
public function getByIteratorToArray()
{
$directory = new RecursiveDirectoryIterator($this->path);
return count(iterator_to_array($directory));
}
public function getByIteratorToArrayWithRewind()
{
$directory = new RecursiveDirectoryIterator($this->path);
$directory->rewind();
return count(iterator_to_array($directory));
}
}
$test = new Test();
$test->createTestFiles();
$test->runTest();
------------------------------------------------------------------------
[2020-09-04 08:02:35] 397836525 at qq dot com
Description:
------------
I tried to use the RecursiveDirectoryIterator with the foreach funtion to get all the files below a
directory, and I found some files were missing from the result.After some experiments, it seems that
it only happens under the circumstance of a directory with large amount of files, like 60 or more.
here's the code:
<?php
$directory = new RecursiveDirectoryIterator($this->path);
foreach ($directory as $filename => $fileInfo) {
echo $filename . PHP_EOL;
}
?>
please use the patch file to reproduce the bug.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=80056&edit=1