用递归方法:
FindFirstFile()和FindNextFile就可搞定.

解决方案 »

  1.   

    shell api中有这个东东,SHGetFolderPath()
      

  2.   

    SHBrowserForFolder(BROWSEINFO* pBI);
    class CAboutDlg : public CDialog
    {
    public:
    static CString m_szRootDir;
    CString GetDirectory(CWnd* pParent,LPCSTR lpszRoot,LPCSTR lpszTitle);
    /// 省略 }CString CAboutDlg::m_szRootDir;
    int CALLBACK BrowseCallbackFunc(HWND hWnd,UINT msg,LPARAM lParam,LPARAM pData)
    {
    TCHAR szBuffer[MAX_PATH];
    switch(msg)
    {
    // 当对话框初始化时,改变到选中的一个目录处
    case BFFM_INITIALIZED:
    strcpy(szBuffer,CAboutDlg::m_szRootDir);
    ::SendMessage(hWnd,BFFM_SETSELECTION,TRUE,(LPARAM)szBuffer);
    break;
    // 如果选择了BIF_STATUSTEXT,则用户每次选择不同的文件夹都
    // 可以在这里设置状态
    case BFFM_SELCHANGED:
    if(::SHGetPathFromIDList((LPITEMIDLIST)lParam,szBuffer))
    ::SendMessage(hWnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szBuffer);
    break;
    } return 0;
    };CString CAboutDlg::GetDirectory(CWnd *pParent, LPCSTR lpszRoot, LPCSTR lpszTitle)
    {
    CString str;
    BROWSEINFO bi;
    bi.hwndOwner = pParent->m_hWnd; // 创建的对话框的所有者
    bi.pidlRoot = 0; // 显示的根路径,为NULL 时显示桌面
    bi.pszDisplayName = 0; // 被选中文件夹的显示名称
    bi.lpszTitle = lpszTitle; // 对话框窗口标题
    bi.lpfn = BrowseCallbackFunc; // 回调函数
    bi.lParam = 0; bi.ulFlags = BIF_RETURNONLYFSDIRS // 只允许选中一个目录
    | BIF_STATUSTEXT // 创建状态文本传递给回调函数
    | BIF_BROWSEFORCOMPUTER // 只允许用户选中一个电脑
    | BIF_BROWSEFORPRINTER // 只允许用户选中一个打印机
    | BIF_BROWSEINCLUDEFILES// 显示可选取的文件
    | BIF_DONTGOBELOWDOMAIN // 当用户浏览"全部网络"时,不允许进入任何域
    | 0;
    m_szRootDir = lpszRoot; // Save for callback routine LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi); if(pidl)
    {
    LPTSTR szBuffer = str.GetBuffer(MAX_PATH);
    ::SHGetPathFromIDList(pidl,szBuffer);
    ::GlobalFree(pidl);
    str.ReleaseBuffer();
    } return str;}