Re: DirectoryIterator
| From: | Nathan Nobbe | Date: | Tue, 26 Jan 2010 21:24:01 +0000 |
| Subject: | Re: DirectoryIterator | ||
| References: | 1 2 3 4 5 6 7 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-301496@lists.php.net to get a copy of this message | ||
On Tue, Jan 26, 2010 at 2:06 PM, Nathan Nobbe <quickshiftin@gmail.com>wrote:
> On Tue, Jan 26, 2010 at 2:05 PM, Christoph Boget <cboget@hotmail.com>wrote:
>
>> I executed the following test script several times. Each time, in a
>> separate terminal window, I ran "touch bob.txt" after the script started
>> echoing out. After the script completed, I deleted bob.txt. During each
>> execution, not once did bob.txt show up in the output. This makes me
>> believe that the file collection that DirectoryIterator is going to work
>> with is set at instantiation. If that's the case, it makes little sense
>> to
>> me that you are unable to get the size of that collection from the
>> DirectoryInterator object.
>>
>> <?php
>> $dirList = new DirectoryIterator(MY_DIR);
>> foreach($dirList as $file )
>> {
>> echo $file->getFilename() . '<br>';
>> flush();
>> sleep( 1 );
>> }
>> ?>
>>
>
> in that case you would likely need to expose something extra from the C
> layer.
>
fwiw.., a quick peak at the code reveals the following:
. in the DirectoryIterator constructor it looks like the directory is
iterated at the C level
/* {{{ proto void DirectoryIterator::__construct(string path)
Cronstructs a new dir iterator from a path. */
SPL_METHOD(DirectoryIterator, __construct)
{
/* .... */
spl_filesystem_dir_open(intern, path TSRMLS_CC);
/* .... */
}
/* }}} */
. this iteration is implemented in some php stream code, but it looks like
some internal C structures are tracking the file count
PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags,
php_stream_context *context,
int (*compare) (const char **a, const char **b) TSRMLS_DC)
{
/* im pretty sure this is where the number of files is stored .. */
int nfiles = 0;
/* read rest of function in main/streams/streams.c */
}
-nathan