MFC遍历文件FindNextFile(),怎样控制文件遍历的顺序?

woody03 2014-02-26 03:41:52
我用CFileFind类中的FindNextFile()函数实现了遍历文件夹中所有图像,我的文件夹中的图像是按照视频帧的顺序以帧数(1.bmp 2.bmp等)形式命名的,处理的时候必须按照视频帧的时间顺序来处理,但是我发现遍历读取文件的时候是按照文件名顺序读取的顺序是:1.bmp, 10.bmp, 11.bmp, ..., 2.bmp...

有没有人知道怎么控制遍历顺序,让其按照1.bmp, 2.bmp, 3.bmp,...的顺序遍历,求大神解答!
...全文
770 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2014-05-09
  • 打赏
  • 举报
回复
//集合 #include <vector> #define VEC_STRING std::vector<CString> VEC_STRING VecImageName;//图片文件夹的图片名称集合 GetFloderVecImageName(szImageFloderPath, VecImageName);//获取图片名称集合 sort(VecImageName.begin(), VecImageName.end(), CmpImageName); /*********************************************************** ** 功能描述: 获取文件夹下的图片名称集合 ************************************************************/ void CReadImageDataDlg::GetFloderVecImageName(CString szPath, VEC_STRING& VecImageName) { CFileFind ff; BOOL bFind = ff.FindFile(szPath + _T("\\*.*")); while(bFind) { bFind = ff.FindNextFile(); if (ff.IsDots() || ff.IsSystem() || ff.IsHidden() || ff.IsDirectory()) { continue; } else { CString szFilePath = ff.GetFilePath(); CString szExt = HandlePath::GetFileExt(szFilePath);//文件后缀 //判断文件后缀 if (_T("bmp") != szExt) { continue; } CString szFileName = ff.GetFileName(); //判断文件名称 //if (szFileName.Left(4) != _T("IMG_")) //{ // continue; //} //添加图片名称 VecImageName.push_back(szFileName); } } } //用来做图片名称比较函数 bool CmpImageName(CString &string1, CString &string2) { CString szNum1 = string1.Mid(4, string1.GetLength() - 8); int nNum1 = _ttoi(szNum1); CString szNum2 = string2.Mid(4, string2.GetLength() - 8); int nNum2 = _ttoi(szNum2); if (nNum1 < nNum2) { return true; } else { return false; } }
  • 打赏
  • 举报
回复
用set或map来存储,开发自定义的比较函数,这样存储进去,就是按照你的期望有序的了
kivien 2014-05-08
  • 打赏
  • 举报
回复
引用 8 楼 u014693469 的回复:
楼主问题解决没?求教?
按照上面人说的啊 先乱序读入vector之类的容器 然后自己写个排序函数 就得到你的内容了 或者看下#7的说明,反正我看不太懂
TONYBACKPACKER 2014-05-08
  • 打赏
  • 举报
回复
楼主问题解决没?求教?
luofushan 2014-02-27
  • 打赏
  • 举报
回复
您好, 可以读取文件时间 进行排序
赵4老师 2014-02-27
  • 打赏
  • 举报
回复
system("dir /b /a-d /os c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字,按文件大小从小到大顺序 system("dir /b /a-d /s /o-d c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录,按文件时间从新到旧顺序 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
aa65433 2014-02-26
  • 打赏
  • 举报
回复
自己排序 否则按文件系统的存储顺序读取的
华美乐章 2014-02-26
  • 打赏
  • 举报
回复
你自己遍历完,在自己排序吧。
sup_ace 2014-02-26
  • 打赏
  • 举报
回复
既然知道命名格式 为什么不用个 for循环 for(int i = 1;i<100;i++) { ..... str.Format("%d.bmp",i); ....... }
凌乱哥 2014-02-26
  • 打赏
  • 举报
回复
貌似没有什么方法,就是按照系统的文件名顺序来遍历的
凌乱哥 2014-02-26
  • 打赏
  • 举报
回复
你在他遍历完后的集合里,自己再排序吧

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧