您的位置:首页 > 编程语言 > C语言/C++

文件按时间排序的一个实现思路

2016-08-27 16:51 387 查看
那你今天算是遇到"高手"了~~~
B)

#define MAKELONG(Hi, Lo)	(((long)Hi << 16) | (long)Lo)
#define MAX_FILENUM                  2000

// 自定义文件列表数据结构.
typedef struct tagFileListData
{
char	m_sName[8];	// 文件名(不含结束符).
char	m_sExt[4];	// 扩展名(不含结束符).
long	m_lDate;	// 文件日期时间(DOS格式).
long	m_lSize;	// 文件大小(字节).
uchar	m_ucAttrib;	// 文件属性.
} FILELISTDATA;

int               g_nOrder = 1;

FILELISTDATA      ListData[MAX_FILENUM];// 线性数组缓冲区,便于使用库函数qsort()排序.
FILELISTDATA	*pFileListData = ListData;
struct find_t	Find;
char    szPath[_MAX_PATH], szDir[_MAX_DIR];
char	szName[_MAX_FNAME], szExt[_MAX_EXT];
uint	nAttrib;
int 	nNum;

// 要查找的路径.
strcpy(szPath, "D:\C700\BIN\*.*");

// 初始化文件个数计数器.
nNum = 0;
if(!_dos_findfirst(szPath, nAttrib, &Find))
{
if(Find.attrib & nAttrib)
{
// 分解文件名.
_splitpath(Find.name, szDrive, szDir, szName, szExt);
// 填充文件数据结构.
memcpy(pFileListData->m_sName, szName, strlen(szName));
memcpy(pFileListData->m_sExt, szExt, strlen(szExt));
pFileListData->m_lDate = MAKELONG(Find.wr_date, Find.wr_time);
pFileListData->m_lSize = Find.size;
pFileListData->m_ucAttrib = Find.attrib;
// 增加文件计数器.
nNum ++;
pFileListData ++;
}
while(!_dos_findnext(&Find))
{
if(Find.attrib & nAttrib)
{
// 分解文件名.
_splitpath(Find.name, szDrive, szDir, szName, szExt);
// 填充文件数据结构.
memcpy(pFileListData->m_sName, szName, strlen((szName));
memcpy(pFileListData->m_sExt, szExt, strlen(szExt));
pFileListData->m_lDate = MAKELONG(Find.wr_date, Find.wr_time);
pFileListData->m_lSize = Find.size;
pFileListData->m_ucAttrib = Find.attrib;
// 增加文件计数器.
nNum ++;
pFileListData ++;
// 如果超过最大个数则退出.
if(nNum >= MAX_FILENUM) break;
}
}
}

// 按照时间排序, 执行完毕ListData[]数组中的文件已经完成排序.
// 照此方法还可以按照文件名等属性排序.
qsort(ListData, nNum, sizeof(FILELISTDATA), SortByDate);

// 比较函数.
// 按照文件生成的日期和时间排序.
int _far SortByDate(FILELISTDATA *pData1, FILELISTDATA *pData2)
{
int 	nRet;

if(pData1->m_lDate < pData2->m_lDate) nRet = -1;
else if(pData1->m_lDate > pData2->m_lDate) nRet = 1;
else nRet = 0;

// g_nOrder是个全局变量,取值为1时为升序,-1为降序.
return(g_nOrder * nRet);
}

使用MSC6.0或MS C/C++7.0编译,borland系列的自己改函数名吧~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC++
相关文章推荐