Bug #80056 [Opn]: missing files when using `foreach` to iterate `RecursiveDirectoryIterator`

From: 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

« previous php.bugs (#228875) next »