[fpc-pascal] File Enumeration speed

Marco van de Voort marcov at stack.nl
Sat Jul 28 23:25:05 CEST 2012


In our previous episode, Michael Van Canneyt said:
> lgetxattr("/etc/odbc.ini", "security.selinux", 0x14de920, 255) = -1 ENODATA (No data available)
> getxattr("/etc/odbc.ini", "system.posix_acl_access", 0x0, 0) = -1 EOPNOTSUPP (Operation not supported)
> 
> If you want speedier operation, and have enough file information with the name, you can simply do a getdents().

I wouldn't do that for two reasons:

1) getdents is not portable at the syscall level (unix systems either implement
getdirentries or getdents, not both). This is why getdents is not available
via portable calls.
2) it is very sensitive.

Basically findfirst is a opendir/readdir/closedir loop where opendir and/or readdir
call getdents, with a stat per file.

IOW one can avoid getdents by doing opendir/readdir/closedir, and be as
fast, AND be portable.
 
> > does the operating system keep an index somewhere ?
> 
> Normally not (at least other than the regular disc cache).

The getdents calls afaik simply returns blocks from the directory file. The
basic block level cache of the filesystem driver therefore works perfectly
for it.



More information about the fpc-pascal mailing list