需求:
目标文件夹: 包含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;
}