
Gennadiy Rozental wrote:
"Angus Leeming" <angus.leeming@btopenworld.com> wrote in message news:cj96ub$l89$1@sea.gmane.org...
Dear all,
I've taken Richard Johnson's glob_iterator that he posted to the list back in January and re-written it completely, using Boost.Spirit to transform the input 'glob' into an equivalent regex. The result is a 'boost::glob' function that I believe is fully POSIX-conformant.
Example usage:
fs::path const starting_directory("."); std::list<fs::path> const matches = boost::glob("../te?t/foo*bar", starting_directory);
This look way too inefficient. Why would you want to copy list of complex objects? Iterator interface seems much better fit here.
Hi, Gennadiy. Rich Johnson's original proposal was for class glob_iterator : public filter_iterator< glob_predicate<>, filesystem::directory_iterator> struct glob_iterator {}; Indeed, I've retained this, although I shoved it into namespace boost::detail. The problem is that this glob_iterator will iterate only over the contents of a single directory. Moreover, good implementations of the system glob require that: In order to have access to a pathname, this function requires search permission on every component of a pathname except the last, and read permission on each directory of any filename component in @c pattern that contains a wild card. which means that you *shouldn't* use glob_iterator if the component does not contain wildcards. Would you be happy if I changed the interface to: std::list<fs::path> matches; boost::glob(matches, "../te?t/foo*bar", starting_directory); If not, could you expand further? Regards, Angus