Bug #80056 [Opn]: missing files when using `foreach` to iterate `RecursiveDirectoryIterator`
| From: | 397836525 at qq dot com | Date: | Fri, 04 Sep 2020 08:08:44 +0000 |
| Subject: | Bug #80056 [Opn]: missing files when using `foreach` to iterate `RecursiveDirectoryIterator` | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-228875@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
User updated by: 397836525 at qq dot com
Reported by: 397836525 at qq dot com
Summary: missing files when using
foreach to iterate
RecursiveDirectoryIterator
Status: Open
Type: Bug
Package: *Directory/Filesystem functions
Operating System: Windows
PHP Version: 7.4.10
Block user comment: N
Private report: N
New Comment:
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();
Previous Comments:
------------------------------------------------------------------------
[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