https://blog.csdn.net/sunlin972913894/article/details/105967761
最近遇到一个需求,需要读取文件夹中的所有图片,并根据图片名字对图片进行排序。这里利用boost::filesystem库对文件夹进行扫描,然后把对应图片后缀的文件名(绝对路径)放入一个容器中,再对容器中的元素进行排序,排完序在做后处理,具体实现如下:
#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;
}
输出结果:
/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
————————————————
版权声明:本文为CSDN博主「Glücklichste」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunlin972913894/article/details/105967761
文章评论