请问怎样对文件按文件名进行排序?

yygcyupeng 2008-05-07 04:54:10
用CFileFind类遍历一个文件夹下的文件,发现它并不是按照windows标准的按文件名排序方式排序的,比如说1.txt,2.txt,3.txt,4.txt,5.txt,...80.txt,81.txt,...100.txt,101.txt.....在windows下应该是这样的顺序,但是让CFileFind类遍历后却成了1.txt。10.txt,100.txt,2.txt。。。。排序方式不一样。请问怎样才能实现和windows一样的按名称排序的方式呢,小弟刚学MFC,请说的具体些,谢谢。。。
...全文
1955 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
happybird1985 2009-09-15
  • 打赏
  • 举报
回复
up.
zhouzhenyan 2008-06-14
  • 打赏
  • 举报
回复
up。
HuWenjin 2008-05-10
  • 打赏
  • 举报
回复
使用

CStringArray
CFileFind

第一步:
CFileFind 查找所有的文件,获取文件名,存入 CStringArray 中

第二步:
对 CStringArray 用你自己需的顺序排序

你可以在排序时按需要把文件名转成数值,再比较大小
最简单的,时间最长的就是冒泡排序了
zhouzhenyan 2008-05-10
  • 打赏
  • 举报
回复
可以这样写,用STL中的支持随机访问的容器,如vector等,用算法sort排序。

CFileFind finder;
std::vector<CString> fileList;

// 加入文件到fileList中
BOOL bHaveFiles = finder.FindFile("*.*");
while (bHaveFiles)
{
bHaveFiles = finder.FindNextFile();
fileList.push_back(finder.GetFileName());
}

// 写一个全局的谓词函数
// 升序排列
bool SortbyNumASC(const CString& x, const CString& y)
{
int nLeft, nRight;
nLeft = atoi(x.Left(x.ReverseFind('.')).GetBuffer(0));
nRight = atoi(y.Left(y.ReverseFind('.')).GetBuffer(0));
return nLeft<nRight;
}

// 降序排列
bool SortbyNumDESC(const CString& x, const CString& y)
{
int nLeft, nRight;
nLeft = atoi(x.Left(x.ReverseFind('.')).GetBuffer(0));
nRight = atoi(y.Left(y.ReverseFind('.')).GetBuffer(0));
return nLeft>nRight;
}

// 排序
/// 由大到小排
sort(fileList.begin(), fileList.end(), SortbyNumDESC);

/// 由小到大排
sort(fileList.begin(), fileList.end(), SortbyNumASC);

cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
可以用list类。

先构造一个list,例如:
list<string> files;
然后搜索文件并用files.push_back函数将文件名添加到list里面。
比较时调用files.sort,参数需要给一个用于比较的回调函数,函数原形如下:
bool compare(string a, string b);
比较完后,
list<string>::iterator i;
for (i=files.begin( ); i!=files.end( ); i++)
{
*i就是排序后的各个string。
}
Kudeet 2008-05-07
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/trace/colsort.aspx
xiantongyuan 2008-05-07
  • 打赏
  • 举报
回复
自己将搜索到文件按名字进行排序,好像没有现成的。
先将文件名加到一个链或者别的什么中,然后你想怎么排序就怎么排序了
yygcyupeng 2008-05-07
  • 打赏
  • 举报
回复
哪位大哥可以给个代码,或者例子也行,我不大会操作。比如说CStringList怎么排序等。。
vocanicy 2008-05-07
  • 打赏
  • 举报
回复
NTFS格式都是按文件名排序的

你可以先把找到的文件名按顺序插入链表
最后再统一处理所有文件
yygcyupeng 2008-05-07
  • 打赏
  • 举报
回复
楼上几位大哥都说的很好。可是能不能详细点。我不大会具体操作,最好有点代码
用户 昵称 2008-05-07
  • 打赏
  • 举报
回复
目前都是自行排序的,好像ntfs系统上是按名称排序的。
HuWenjin 2008-05-07
  • 打赏
  • 举报
回复
CFileFind 排序和WINDOWS 是一样的

是按字符串的大小来比较的,而不是眼睛看到的数字,实际上是比较的ASCII码

10.txt 和 2.txt 首先 0x31 '1' < 0x32 '2' 所以 10.txt 在 2.txt 前面

如果想按数字大小比较排序,需要手动处理

sscanf(szFileName,"%d.txt",&nIdxFile);

szFileName 是 100.txt 这样的文件名,输入
nIdxFile 是数值 100 输出

然后再排序
Kudeet 2008-05-07
  • 打赏
  • 举报
回复
但是在自己排序时可以利用Windows的一些控件,例如ClistCtrl把属性设置为排序,或者CTreeCtrl添加TVI_SORT。这样就能自动实现排序
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
在比较字符串的时候,如果遇到数字,就把连续的数字转换成转换为整数当作一个字符来看。
Kudeet 2008-05-07
  • 打赏
  • 举报
回复
CFileFind类返回的顺序和文件系统相关的,因此你不能完全控制的。一般都得自己根据查找结果进行排序.

16,471

社区成员

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

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

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