C ++ escanea los archivos en la carpeta y ordena las cadenas de nombre de archivo

       Recientemente, encontré la necesidad de leer todas las imágenes de la carpeta y ordenar las imágenes según el nombre de la imagen. Aquí, la biblioteca boost :: filesystem se usa para escanear la carpeta, y luego el nombre del archivo (ruta absoluta) correspondiente al sufijo de la imagen se coloca en un contenedor, y luego se ordenan los elementos en el contenedor, y la clasificación se realiza en posprocesamiento, y la implementación específica es la siguiente:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <boost/filesystem.hpp>

void scanFilesUseBoost(const std::string& rootPath,
                       std::vector<std::string>& container, std::string extension)
{
    //container.clear();
    boost::filesystem::path fullpath(rootPath);

    if(!boost::filesystem::exists(fullpath) || !boost::filesystem::is_directory(fullpath))
    {
        std::cerr<<"File path not exist!" << std::endl;
        return;
    }

    boost::filesystem::recursive_directory_iterator end_iter;
    for(boost::filesystem::recursive_directory_iterator iter(fullpath); iter!=end_iter; iter++)
    {
        try
        {
            if(boost::filesystem::is_directory( *iter ) ){
                std::cout<<*iter << "is dir" << std::endl;
                //scanFilesUseRecursive(iter->path().string(),container,extension); //if find file recursively
            }
            else
            {
                if(boost::filesystem::is_regular_file(*iter) && iter->path().extension() == extension)
                    container.push_back(iter->path().string());
//                std::cout << *iter << " is a file" << std::endl;
            }
        } catch ( const std::exception & ex ){
            std::cerr << ex.what() << std::endl;
            continue;
        }
    }
}

bool GreaterEqSort(std::string filePath1, std::string filePath2)
{
    int len1 = filePath1.length();
    int len2 = filePath2.length();
    //    std::cout<<"len1:"<<len1<<" path:"<<filePath1<<std::endl;
    //    std::cout<<"len2:"<<len2<<" path:"<<filePath2<<std::endl;
    if(len1 < len2)
    {
        return false;
    }
    else if(len1 > len2)
    {
        return true;
    }
    else
    {
        int iter = 0;
        while(iter < len1)
        {
            if(filePath1.at(iter) < filePath2.at(iter))
            {
                return false;
            }
            else if(filePath1.at(iter) > filePath2.at(iter))
            {
                return true;
            }
            ++iter;
        }
    }
    return true;
}

bool LessSort(std::string filePath1, std::string filePath2)
{
    return (!GreaterEqSort(filePath1, filePath2));
}


void pathSort(std::vector<std::string> &paths, int sortMode)
{

    if(sortMode == 1)
    {
        std::sort(paths.begin(), paths.end(), LessSort);
    }
}

int main(int argc, char *argv[])
{
    std::string path = "/media//result/img";
    std::vector<std::string> vec;
    vec.clear();
    scanFilesUseBoost(path, vec, ".jpg");

    pathSort(vec, 1);
    for(auto &it:vec)
        std::cout<<it<<std::endl;

}

Resultado de salida:

/media...../result/img/0.jpg
/media...../result/img/1.jpg
/media...../result/img/2.jpg
/media...../result/img/3.jpg
/media...../result/img/4.jpg
/media...../result/img/5.jpg
/media...../result/img/6.jpg
/media...../result/img/7.jpg
/media...../result/img/8.jpg
/media...../result/img/9.jpg
/media...../result/img/10.jpg
/media...../result/img/11.jpg
/media...../result/img/12.jpg
/media...../result/img/13.jpg
/media...../result/img/14.jpg
/media...../result/img/15.jpg
/media...../result/img/16.jpg
/media...../result/img/17.jpg
/media...../result/img/18.jpg
/media...../result/img/19.jpg
/media...../result/img/20.jpg
/media...../result/img/21.jpg
/media...../result/img/22.jpg
/media...../result/img/23.jpg

 

Supongo que te gusta

Origin blog.csdn.net/sunlin972913894/article/details/105967761
Recomendado
Clasificación