1. 程式人生 > >檔案按時間排序的一個實現思路

檔案按時間排序的一個實現思路

那你今天算是遇到"高手"了~~~ 
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系列的自己改函式名吧~~~