需求:
目标文件夹: 包含Task.rec文件。
假定: 目标文件夹只存放在磁盘根目录及次级目录下。
参数: strlist &tasks —— 保存检索到的目标文件夹路径。
返回: 目标文件夹的路径集合。Task.rec中包含有每个文件夹的时间,路径以时间先后排序。
在GetLastestTasks()函数中,遍历所有磁盘目录;如果是正常磁盘,则调用FindTask().
在FindTask()函数中,则通过WIN32_FIND_DATA结构、FindFirstFile()、FindNextFileW()来遍历文件夹和遍历文件,发现包含Task.rec的目标文件夹后,调用InserStr()将路径插入结果集。
在InsertStr()函数中,解析Task.rec文件,读出时间信息,然后通过插入排序,把该路径插入strlist(lstTask)的正确位置。为了进行比较排序,使用了一个新的strlist(lstTime)来保存时间。
声明:
bool_t GetLastestTasks(strlist &tasks); bool_t FindTask(strlist &task, ::wstring path); bool_t InsertStr(strlist &task, ::wstring str);
实现:
bool_t XMLTaskInfoMgr_6C::GetLastestTasks(strlist &tasks) { DWORD drivs = GetLogicalDrives(); int c = 0x00000001; WCHAR m = _T('A'); tasks.RemoveAll(); for(int i=1; i<=16; i++) { int ct = drivs & c; if(ct) { CString root; root.Format(_T("%c:\\"), m); unsigned int type = GetDriveType(root); if(type == DRIVE_FIXED || type == DRIVE_REMOVABLE) { FindTask(tasks, root.GetBuffer()); } } c = c<<1; m++; } return true; } bool_t XMLTaskInfoMgr_6C::FindTask(strlist &task, ::wstring path) { CString base = path; CString tmp = base + _T("*.*"); WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile(tmp, &fd); do { if(fd.cFileName[0] != '.') { if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { CString tmp2(fd.cFileName); CString base2 = base + tmp2; tmp2 = base + tmp2 + _T("\\*.*"); WIN32_FIND_DATA fd2; HANDLE hFind2 = FindFirstFile(tmp2, &fd2); do { if(fd2.cFileName[0] != '.') { if(fd2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { CString tmp3(fd2.cFileName); CString base3 = base2 + _T("\\") + tmp3; tmp3 = base2 + _T("\\") + tmp3 + _T("\\Task.rec"); File f; if(f.Open(tmp3, false)) { f.Close(); InsertStr(task, base3.GetBuffer()); } } else { if(StrCmpW(fd2.cFileName, _T("Task.rec")) == 0) { /*CString str(fd2.cFileName); str = base2 + _T("\\") + str;*/ InsertStr(task, base2.GetBuffer()); } } } } while (FindNextFileW(hFind2, &fd2)); } } } while (FindNextFileW(hFind, &fd)); return true; } bool_t XMLTaskInfoMgr_6C::InsertStr(strlist &task, ::wstring str) { CString pa(str); pa = pa + _T("\\Task.rec"); attrset as; as.SetAt(TaskInfoMgr_6C::FILE_PATH, pa); TaskInfoMgr_6C *tbsm = CreateTaskInfoMgr_6C(_T("xml")); tbsm->StartUp(as); datatable tdtb; tbsm->GetTaskInfo(tdtb); int32_t nc = tdtb.GetColCount(); datacol dc = tdtb.GetColumns(); CString text; int32_t index; for(int i=0; i<nc; i++) { text = dc.operator[](i); if(text == _T("taskTime")) { index = dc.operator[](text.GetBuffer()); break; } } pos_t pos = tdtb.GetHeadRow(); datarow dr = tdtb.GetNextRow(pos); LPWSTR buf = new wchar_t[50]; memset(buf, 0, sizeof(wchar_t)*50); dr.GetAt(index, buf); CString sbuf(buf); int hn = (int)lstTask.GetCount(); if(hn == 0) { lstTask.AddTail((CString)str); lstTime.AddTail(sbuf); } else { POSITION pz = lstTime.GetHeadPosition(); POSITION pt = lstTask.GetHeadPosition(); while(pz) { POSITION cp_pz, cp_pt; cp_pz = pz; cp_pt = pt; CString cmp = lstTime.GetNext(pz); CString kkk = lstTask.GetNext(pt); if(sbuf > cmp) { lstTask.InsertBefore(cp_pt, (CString)str); lstTime.InsertBefore(cp_pz, sbuf); if(hn >= 10) { lstTask.RemoveTail(); } break; } } } task.RemoveAll(); POSITION ss = lstTask.GetHeadPosition(); while(ss) { CString ans = lstTask.GetNext(ss); task.AddTail(ans); } delete buf; return true; }