Get an ordered list of files in a folder

17k Views Asked by At

I have used boost::filesystem::directory_iterator in order to get a list of all the available files into a given folder.

The problem is that I supposed this method would give me the files in alphabetical order, while the results seem pretty random.

Is there any fancy way of alphabetically sorting them?

My current code:

if(boost::filesystem::is_directory(myFolder)){
    // Iterate existing files
    boost::filesystem::directory_iterator end_iter;
    for(boost::filesystem::directory_iterator dir_itr(myFolder);
        dir_itr!=end_iter; dir_itr++){

        boost::filesystem::path filePath;
        // Check if it is a file
        if(boost::filesystem::is_regular_file(dir_itr->status())){
            std::cout << "Reading file " << dir_itr->path().string() << std::cout;
        }
    }
}
2

There are 2 best solutions below

2
On BEST ANSWER

The fanciest way I've seen to perform what you want is straight from the boost filesystem tutorial. In this particular example, the author appends the filename/directory to the vector and then utilizes a std::sort to ensure the data is in alphabetical order. Your code can easily be updated to use this same type of algorithm.

0
On

straight from the boost filesystem tutorial.

Thank you Tyler for the link.

If you are lazy, here is the adapted code:

std::vector<std::filesystem::path> files_in_directory;
std::copy(std::filesystem::directory_iterator(myFolder), std::filesystem::directory_iterator(), std::back_inserter(files_in_directory));
std::sort(files_in_directory.begin(), files_in_directory.end());

for (const std::string& filename : files_in_directory) {
    std::cout << filename << std::endl; // printed in alphabetical order
}