I have 2 functions for read files list in one directory. One uses Win32 and one uses boost:
FWIW, directory_iterator_increment() look like this: void directory_iterator_increment(directory_iterator& it, system::error_code* ec) { BOOST_ASSERT_MSG(it.m_imp.get(), "attempt to increment end iterator"); BOOST_ASSERT_MSG(it.m_imp->handle != 0, "internal program error"); path::string_type filename; file_status file_stat, symlink_file_stat; system::error_code temp_ec; for (;;) { temp_ec = dir_itr_increment(it.m_imp->handle, # if defined(BOOST_POSIX_API) it.m_imp->buffer, # endif filename, file_stat, symlink_file_stat); if (temp_ec) // happens if filesystem is corrupt, such as on a damaged optical disc { path error_path(it.m_imp->dir_entry.path().parent_path()); // fix ticket #5900 it.m_imp.reset(); if (ec == 0) BOOST_FILESYSTEM_THROW( filesystem_error("boost::filesystem::directory_iterator::operator++", error_path, error_code(BOOST_ERRNO, system_category()))); ec->assign(BOOST_ERRNO, system_category()); return; } else if (ec != 0) ec->clear(); if (it.m_imp->handle == 0) // eof, make end { it.m_imp.reset(); return; } if (!(filename[0] == dot // !(dot or dot-dot) && (filename.size()== 1 || (filename[1] == dot && filename.size()== 2)))) { it.m_imp->dir_entry.replace_filename( filename, file_stat, symlink_file_stat); return; } } } ...and the inner dir_itr_increment() function involves the following: perms make_permissions(const path& p, DWORD attr) { perms prms = fs::owner_read | fs::group_read | fs::others_read; if ((attr & FILE_ATTRIBUTE_READONLY) == 0) prms |= fs::owner_write | fs::group_write | fs::others_write; if (BOOST_FILESYSTEM_STRICMP(p.extension().string().c_str(), ".exe") == 0 || BOOST_FILESYSTEM_STRICMP(p.extension().string().c_str(), ".com") == 0 || BOOST_FILESYSTEM_STRICMP(p.extension().string().c_str(), ".bat") == 0 || BOOST_FILESYSTEM_STRICMP(p.extension().string().c_str(), ".cmd") == 0) prms |= fs::owner_exe | fs::group_exe | fs::others_exe; return prms; } ...where each of the 4 comparisons invokes conversion from wchar_t* to std::string. So, there's obviously a lot of overhead, but the question is whether it's really a bottleneck in a real-life application.