Sane C++ Libraries
C++ Platform Abstraction Libraries
File System Iterator

Table of Contents

🟨 Enumerates files and directories inside a given path

SC::FileSystemIterator enumerates files and directories at a given path.

Features

  • Iterate files in directory
  • Handle recursive iteration

Status

🟩 Usable
The library is simple but gets the job done.
Thanks to Strings library it handles UTF16 / UTF8 conversions seamlessly, making less difficult writing cross platform filesystem iteration / manipulation code.

Description

FileSystemIterator uses an iterator pattern to enumerate files instead of a callback. This allows avoiding blocking on enumeration of very large directories and also the allocation of a huge number of strings to hold all filenames. When configuring an iteration, the caller can ask for a fully recursive enumeration or manually call SC::FileSystemIterator::recurseSubdirectory when the current SC::FileSystemIterator::Entry item (obtained with SC::FileSystemIterator::get) matches a directory of interest.

Example of recursive iteration of a directory:

FileSystemIterator fsIterator;
fsIterator.options.recursive = true;
SC_TEST_EXPECT(fsIterator.init(report.applicationRootDirectory));
while (fsIterator.enumerateNext())
{
report.console.printLine(fsIterator.get().path);
}
SC_TEST_EXPECT(fsIterator.checkErrors());
#define SC_TEST_EXPECT(e)
Records a test expectation (eventually aborting or breaking o n failed test)
Definition: Testing.h:113

If only some directories should be recursed, manual recursion can help speeding up directory iteration:

FileSystemIterator fsIterator;
fsIterator.options.recursive = false; // As we manually call recurseSubdirectory
SC_TEST_EXPECT(fsIterator.init(report.applicationRootDirectory));
while (fsIterator.enumerateNext())
{
const FileSystemIterator::Entry& entry = fsIterator.get();
report.console.printLine(entry.path);
// Only recurse directories not ending with "someExcludePattern"
if (entry.isDirectory() and not entry.name.endsWith("someExcludePattern"))
{
SC_TEST_EXPECT(fsIterator.recurseSubdirectory());
}
}
SC_TEST_EXPECT(fsIterator.checkErrors());

Roadmap

🟦 Complete Features:

  • Not sure what else could be useful here

💡 Unplanned Features:

  • No hypothesis has been made so far