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