遍历所有磁盘根目录及次级目录,查找目标文件夹

时间:2022-12-05 21:04:58

需求:

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