檔案按時間排序的一個實現思路
阿新 • • 發佈:2019-02-12
那你今天算是遇到"高手"了~~~ 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系列的自己改函式名吧~~~