1. 程式人生 > >遍歷所有磁碟根目錄及次級目錄,查詢目標資料夾

遍歷所有磁碟根目錄及次級目錄,查詢目標資料夾

需求:

        目標資料夾:    包含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;
}  

相關推薦

所有磁碟根目錄次級目錄查詢目標資料

需求:         目標資料夾:    包含Task.rec檔案。         假定:              目標資料夾只存放在磁碟根目錄及次級目錄下。         引數:              strlist &tasks —— 儲存

當前目錄提取指定資料內容並拷貝到指定位置

1、該指令碼為bat指令碼,在Windows下執行 2、指令碼遍歷當前目錄,包含子目錄,找到名稱為“應用程式”的資料夾 3、抽取資料夾的內容,包含子目錄,拷貝到“C:\GSPCloud_Beta管理\最新合併\應用程式” 4、詳細引數可以參考xcopy用法說明 @echo off &am

利用遞迴簡單實現所有資料夾子目錄

1.列出指定目錄下滿足指定條件的檔案的清單,包括子目錄(當前的工程目錄) import java.io.File; public class FileTest { public static void main(String[] args) { File file

所有子物體中renderer(渲染器)中的material(材質)並改變其alpha值實現若隱若現的效果

sys [] object c engine orm 器) gpo gin nts using UnityEngine;using System.Collections;using UnityEngine.UI; public class CubeControl : Mo

python所有盤符下的圖片並拷貝下來

path 腳本 div import ict Coding color 不同類 getc 最近在學習python,閑著無聊就試著寫啦這個小的腳本,雖然有很多不足,但是還是收獲不少。 該腳本的功能: ①遍歷本地計算機中的所有盤符,並將名稱記錄下來; ②循環遍歷盤符下的所有圖片

C# 所有的子控件和孫控件包括容器中的並批量操作和調用

cnblogs ati tex foreach pri int 遍歷 asc 語句 這裏要用兩個知識,一個是遞歸,一個是隊列。 //定義一個Control類型的隊列allCtrls private static Queue <Control> allCtrls

python使用discover方法所有要執行的用例

開始 over 所有 discover 文件名 ret .get 通過 getcwd 當我們寫了一個單個py的測試文件時直接運行就ok了,但當我們有很多很多個這樣的py 時,難道要一個一個的點擊來運行嗎,當然不是。我們可以通過discover方法來找到所有的 用例。 下面直

文件所有文件

body 指定 col out oid void 文件 rect 實例 1 // 該方法遍歷指定目錄下的所有文件 2 public static void listAllFiles(String mypath) { 3 // 實例化F

unity深度查找某個子物體和所有子物體方法

new cal ons foreach 是我 destroy 目標 call void 本文總結一下關於unity的查找子物體的方法 首先說明一下這裏將講三種查找子物體方法: 查找固定路徑的某一個子物體的方法、通過名字深度查找某個子物體的方法、查找父物體下所有子物體的方

Redis所有key的兩個命令 -- KEYS 和 SCAN

() redis 一個 mat 能夠 href data 能說 Language 當我們需要遍歷Redis所有key或者指定模式的key時,首先想到的是KEYS命令: KEYS pattern 官網對於KEYS命令有一個提示: KEYS 的

16、所有關鍵字的api方式

之前的一些講述中,我們介紹了查詢索引的功能,但一般都是通過域和關鍵字進行的查詢,那如果我們不知道域或想要查詢出所有的關鍵字怎麼辦呢,下面我就給出兩個解決方案,程式碼很簡單 通過指定域方式獲取該域中所有的關鍵字 //遍歷指定域中的所有關鍵字的方式 @Test public void sea

FindWindowEx 所有視窗

  FindWindowEx  唯一麻煩是第2個引數的指定 . Explore 下視窗是Z序的  , 實際上就是根據 第一個引數 和 第2個引數 來找 第2個引數後的一個視窗: HWND child = 0; child = FindWindowEx

shell-所有txt,並且獲取txt指定的內容

[[email protected] ~]$ cat get_manager_ip.sh  #!/bin/bash# Filename: get_manager_ip.sh# Description: 指令碼包括兩個功能:# 1,獲取各個產品的manager的ip# 2,check各個產

所有排列可能的類比如列出“a”,"b","c"所有排列的可能

使用方法    Tree tree = new Tree(); tree.addChild("1"); tree.addChild("2"); tree.addChild("3"); tree.addChild("4"); ArrayList<A

android所有子檢視

import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent

SQL Server所有表統計行數

DECLARE CountTableRecords CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.schema_id) FROM sys.tables sst WHERE sst.TYPE

mysql 所有的庫並根據表和sql語句備份

建庫、使用者語句 create database test_hb; create user ' test_hb'@'%' identified by '123456'; grant all privileges on test_hb.* to ' test_hb'@'%'; grant a

Python求最長迴文字串(三重迴圈所有字串 新)

前兩天自己寫了下,雖然對了,但是思路不太好,網上看了遍歷的思路,瞬間感覺之前好蠢,雖然本質上我的程式碼也是遍歷,但是思路不好。 正確思路就是先遍歷出所有長度大於等於2的字串,然後在逐一判斷這些字串是不是迴文字串就行了,思路清晰了,程式碼就簡單多了,10分鐘就寫完了。 d

二叉樹的先序(遞迴和非遞迴)、中序(遞迴和非遞迴)、後序(非遞迴)層次java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

hdu 1599 find the mincost route 無向圖的最小環 求從一個點所有節點以後回到原點的最短

                在寫題解之前給自己打一下廣告哈~。。抱歉了,希望大家多多支援我在CSDN的視訊課程,地址如下:http://edu.csdn.net/course/detail/209題目:find the mincost routeTime Limit: 1000/2000 MS (Java