程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 遍歷文件夾並建成目錄樹

遍歷文件夾並建成目錄樹

編輯:關於VC++

前些日子,我在做程序中遇到這樣一個問題,要用樹型控件快速浏覽指定文 件夾中的文件,經過一番周折,終於做出來了,想到有些仁兄可能遇到和我相同 的困難,所以將我的做法寫出來,希望對大家有些幫助!

(本文程序運行效果圖)

基本原理是用了函數的遞歸調用,再加入參數跟蹤。我在調試程序的時候,跟蹤發現:程序只有在遍歷完一個目錄下所有子目錄後,才返回同級的目錄。這 樣便可以用參數的值來決定目錄的層次。

(1)在對話框上添加樹型控件,選擇Style中Has Buttons、Has Lines、Lines At Root。

(2)定義變量:

HTREEITEM strRoot; //根目錄
HTREEITEM strHTFir; //第一層
HTREEITEM strHTSec; //第二層
HTREEITEM strHtThi; //第三層
HTREEITEM strHtFor; //第四層
HTREEITEM strHtFif; //第五層
// 沒有找到更好的方法,所以只能這樣來顯示,估計一下大約能用到幾層,如 果找到好方法,請告訴我,非常感謝!
HTREEITEM strHtEnd; //文件目錄
(3)添加遍歷文件夾的函數 BrowseFile(int CallNum, CString strFile)

//CalNum-用來記錄第幾層目錄,strFile-路徑

並添加以下內容:

void CFileTreeDlg::BrowseFile(int CallNum, CString strFile)
{
  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(); //關閉
}
(4)在OnInitDialog()函數中設置樹控件的圖標並調用自定義函數 BrowseFile()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,"課程表"); //遍歷"課程表"文件夾 內的所有目錄
}

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved