前些日子,我在做程序中遇到這樣一個問題,要用樹型控件快速浏覽指定文 件夾中的文件,經過一番周折,終於做出來了,想到有些仁兄可能遇到和我相同 的困難,所以將我的做法寫出來,希望對大家有些幫助!
(本文程序運行效果圖)
基本原理是用了函數的遞歸調用,再加入參數跟蹤。我在調試程序的時候,跟蹤發現:程序只有在遍歷完一個目錄下所有子目錄後,才返回同級的目錄。這 樣便可以用參數的值來決定目錄的層次。
(1)在對話框上添加樹型控件,選擇Style中Has Buttons、Has Lines、Lines At Root。
(2)定義變量:
HTREEITEM strRoot; //根目錄
(3)添加遍歷文件夾的函數 BrowseFile(int CallNum, CString strFile)
HTREEITEM strHTFir; //第一層
HTREEITEM strHTSec; //第二層
HTREEITEM strHtThi; //第三層
HTREEITEM strHtFor; //第四層
HTREEITEM strHtFif; //第五層
// 沒有找到更好的方法,所以只能這樣來顯示,估計一下大約能用到幾層,如 果找到好方法,請告訴我,非常感謝!
HTREEITEM strHtEnd; //文件目錄
//CalNum-用來記錄第幾層目錄,strFile-路徑
並添加以下內容:
void CFileTreeDlg::BrowseFile(int CallNum, CString strFile)
(4)在OnInitDialog()函數中設置樹控件的圖標並調用自定義函數 BrowseFile()
{
CallNum++;
CFileFind ff;
CString szDir = strFile;
if(szDir.Right(1) != "\\")
szDir += "\\";
szDir += "*.*";
BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())//目錄是文件夾
{
//如果是一個子目錄,用遞歸繼續往深一層找
CString strPath = ff.GetFilePath(); //得到路徑,做為遞歸 調用的開始
CString strTitle = ff.GetFileTitle(); //得到目錄名,做為 樹控的結點
int i =0;
switch(CallNum)
{
case 1:
strHTFir = m_FileTree.InsertItem (strTitle,0,0,NULL);
break;
case 2:
strHTSec = m_FileTree.InsertItem (strTitle,0,0,strHTFir);
break;
case 3:
strHtThi = m_FileTree.InsertItem (strTitle,0,0,strHTSec);
break;
case 4:
strHtFor = m_FileTree.InsertItem (strTitle,0,0,strHtThi);
break;
default:
strHtFif = m_FileTree.InsertItem (strTitle,0,0,strHtFor);
break;
}
BrowseFile(CallNum,strPath); //遞歸調用
}
else if(!ff.IsDirectory() && !ff.IsDots())//到達最低層 的文件
{
//顯示當前訪問的文件
CString strPath;
CString strTitle;
strPath = ff.GetFilePath();
strTitle = ff.GetFileTitle();
switch(CallNum)
{
case 1:
strRoot = m_FileTree.InsertItem(strTitle,0,0,NULL);
break;
case 2:
strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHTFir);
break;
case 3:
strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHTSec);
break;
case 4:
strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtThi);
break;
case 5:
strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtFor);
break;
default:
strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtFif);
break;
}
}
}
ff.Close(); //關閉
}BOOL CFileTreeDlg::OnInitDialog()
{
m_iImageList.Create(24, 24, TRUE,1, 0); //創建圖標鏈
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_KEBIAO), IMAGE_ICON, 24, 24, 0);
m_iImageList.Add(hIcon);
m_FileTree.SetImageList ( &m_iImageList,TVSIL_NORMAL );
BrowseFile(0,"課程表"); //遍歷"課程表"文件夾 內的所有目錄
}
本文配套源碼