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

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

« previous php.bugs (#228914) next »