请教各位大虾,怎样把某个磁盘的所有文件夹都加入树形控件
比如c :盘下有文件夹asd,abc,qwe,其中 abc下有文件夹cde
让c:成为根节点,asd,abc,qwe成为子节点cde成为孙节点

解决方案 »

  1.   

    用FindFirstFile、FindNextFile遍历目录,并把子目录添加到树的节点
      

  2.   


    void C树形显示文件夹Dlg::OnBnClickedButton1()
    {
        //这段用来调用浏览通用对话框,openfile通用对话框用来打开文件, 浏览则用来选定文件夹
        BROWSEINFO bi;
        ITEMIDLIST *pidl;
        char buf[MAX_PATH] = {0};
        bi.hwndOwner = NULL;
        bi.pidlRoot = NULL;
        bi.pszDisplayName = (LPWSTR)buf;
        bi.lpszTitle = _T("");
        bi.ulFlags = BIF_EDITBOX;
        bi.lpfn = NULL;
        bi.lParam = 0;
        bi.iImage = 0;
        pidl = SHBrowseForFolder(&bi);
        SHGetPathFromIDList(pidl,(LPWSTR)buf);
        m_path.SetWindowTextW((LPWSTR)buf);
        UpdateData(FALSE);
        m_MyTreeCtrl.DeleteAllItems();
        if (m_path.GetWindowTextLengthW()==0)
        {
            AfxMessageBox(L"请选择一个文件夹");
        }
        else
        {
        HTREEITEM root = m_MyTreeCtrl.InsertItem ((LPWSTR)buf);
        showtree((LPWSTR)buf,root);
        }
    }
    //还有一种是用CFileFind的, 好像还更简单一些, 因为CFileFind有好多可以直接用的成员函数, 变量
    //第二个参数的设置是跟网页上的程序学的, 很巧妙的解决了树形显示中插入下一级节点的问题
    void C树形显示文件夹Dlg::showtree(LPWSTR path,HTREEITEM   hParent)
    {
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind = INVALID_HANDLE_VALUE;
        DWORD dwError;
        CString str; 
        HTREEITEM TreeName;
        SetCurrentDirectory (path);
        hFind = FindFirstFile(_T("*.*"), &FindFileData);
        if (hFind == INVALID_HANDLE_VALUE) 
       { 
           str.Format(L"Error:%d",GetLastError());  
           AfxMessageBox(str);
       } 
       else 
       {
          while (FindNextFile(hFind, &FindFileData) != 0)
          {
                  if  (FindFileData.cFileName[0] != '.'&&FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
                      //这里实在是很怪异, 之前试验了几次都不行, 包括
                      //FindFileData.cFileName==_T(".")都不行, 在网页上找了一个copy过来,
                      //居然就行了...
                      //rp问题真是很汗啊
                 {
                     TreeName = m_MyTreeCtrl.InsertItem (FindFileData.cFileName,hParent);
                     showtree(FindFileData.cFileName,TreeName);//递归调用函数, 巧妙的进入下一级
                  }  
          }
          dwError = GetLastError();
          //下面这句话用来返回上一层目录
          //原来没有这句话, 只能显示第一个文件夹里的子文件
          //想了好久才想出来是因为进入子文件夹没有返回
          _chdir("..");
          FindClose(hFind);
          if(dwError!=ERROR_NO_MORE_FILES)
          {
              str.Format(L"error:%d",dwError);
              AfxMessageBox(str);
          }
        }
    }以前写的, 自己也懒得看了...你挑着有用的瞅瞅吧