简述
在MFC中,存在这样一个类,它可以获取目标文件夹下所有的子文件,它就是CFileFind。下面就直接通过一个程序来介绍它。
实例
该实例为:获取目标路径下所有的图像。代码有很多注释,足够理解下面这个程序了。
//方法作用:获取目标路径下的所有图像,保存在矢量容器vector中
//strPath:目标目录,例如“E:\\Img”
//vectList:图像矢量容器
void Get_Image_List( CString strPath,vector<cv::Mat> &vectList )
{
cv::Mat cvImg;
// 遍历文件夹
CFileFind finder;
CString strFindFile;
CString strFindPath;
strFindPath.Format("%s/*.jpg",strPath.GetBuffer());
BOOL bWorking = finder.FindFile(strFindPath);
//创建映射(目的是利用map的key自动排序功能来排序)
map<int,std::string> vPathMap;
while(bWorking)
{
//寻找下一个文件
bWorking = finder.FindNextFile();
//判断是否是目录 并且 判断目录是否是“.”或“..”
//详细介绍见[注解1]
if(finder.IsDirectory() && !finder.IsDots())
{
continue;
}
//获取当前文件路径
strFindFile = finder.GetFilePath();
//获取文件名排序 //注:因所有图像名称格式为"img0.jpg"、"img1.jpg"形式,需将这些图像按照从小到大的顺序排列
string sFilename = strFindFile.GetBuffer();
int pos = sFilename.find_last_of(".");
string sNum = sFilename.substr(pos-1, 1);
int nNum = atoi(sNum.c_str());
//插入map容器
vPathMap.insert(pair<int, string>(nNum, sFilename));
}
finder.Close();
//按顺序读取图像
int len = vPathMap.size();
for (int i = 0; i < len; ++i )
{
string name = vPathMap[i];
cvImg = imread(name);
if (!cvImg.data)
{
continue;
}
vectList.push_back(cvImg);
}
return;
}
[注解1]:
IsDots() 判断目录是否是“.”或“..”
在dos系统中,每个目录下都有缺省的两个目录,分别为"."和"..",分别表示上一层目录和本层目录。因为当我们遍历目录树下的文件时,要过滤掉这两个缺省目录。
每个文件夹都有"."和".."这两个 特殊的子目录,所以在遍历文件目录时,这两个子文件夹是需要特殊处理的,否则会陷入死循环的。