谁知道在vc里怎么获取一个文件夹路径 ,SHGetSpecialFolderLocation  SHBrowseForFolder怎么用的?

解决方案 »

  1.   

    CFileDialog
    不是只能用来打开,保存一个文件吗,我想怎么选择到一个文件夹,不是文件
      

  2.   

    有一个现成的类可以,不过是非模式的对话框,有时候不适合的         CString m_strFolder; if(g_fSelectFolderDlg(&m_strFolder,m_strFolder,false))
    {
    MessageBox(m_strFolder);
    }
    路径就在m_strFolder中,记得包含头文件 #include "global.h"
      

  3.   

    利用CFileDialog类
    如下
    CString path;
    CFileDialog dlg(TRUE,NULL,"*.*");
    if (dlg.DoModal()==IDOK){//当你找到文件并确定打开时
    path = dlg.GetPathName();}
      

  4.   

    不在这里边定义的 shlobj.h
      

  5.   

    当然是用SHBrowseForFolder
    BROWSEINFO info;
    memset(&info,0);SHBrowseForFolder(info);大概就是这个样子啦!
      

  6.   

    我用的是现成的类的方法//dirdialog.h
    ////////////////////////////////////////////////////////////////////////
    // DirDialog.h: interface for the CDirDialog class.
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)
    #define AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_#if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000class CDirDialog
    {
    public:    CDirDialog();
        virtual ~CDirDialog();    BOOL DoBrowse(CWnd *pwndParent = NULL);    CString m_strWindowTitle;
        CString m_strPath;
        CString m_strInitDir;
        CString m_strSelDir;
        CString m_strTitle;
        int  m_iImageIndex;
        BOOL m_bStatus;private:    virtual BOOL SelChanged(LPCSTR /* lpcsSelection */, CString& /* csStatusText */) { return TRUE; };
        static int __stdcall CDirDialog::BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
    };#endif // !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)
      

  7.   

    //dirdialog.cpp///////////////////////////////////////////////////////////////////////////
    // DirDialog.cpp: implementation of the CDirDialog class.
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "DirDialog.h"
    #include "shlobj.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif// Callback function called by SHBrowseForFolder's browse control
    // after initialization and when selection changes
    int __stdcall CDirDialog::BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
        CDirDialog* pDirDialogObj = (CDirDialog*)lpData;
        if (uMsg == BFFM_INITIALIZED )
        {
            if( ! pDirDialogObj->m_strSelDir.IsEmpty() )
                ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));
            if( ! pDirDialogObj->m_strWindowTitle.IsEmpty() )
                ::SetWindowText(hwnd, (LPCTSTR) pDirDialogObj->m_strWindowTitle);
        }
        else if( uMsg == BFFM_SELCHANGED )
        {
            LPITEMIDLIST pidl = (LPITEMIDLIST) lParam;
            char selection[MAX_PATH];
            if( ! ::SHGetPathFromIDList(pidl, selection) )
                selection[0] = '\0';        CString csStatusText;
            BOOL bOk = pDirDialogObj->SelChanged(selection, csStatusText);        if( pDirDialogObj->m_bStatus )
                ::SendMessage(hwnd, BFFM_SETSTATUSTEXT , 0, (LPARAM)(LPCSTR)csStatusText);        ::SendMessage(hwnd, BFFM_ENABLEOK, 0, bOk);
        }
      return 0;
    }//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CDirDialog::CDirDialog()
    {
    m_bStatus = FALSE;
    }CDirDialog::~CDirDialog()
    {
    }BOOL CDirDialog::DoBrowse(CWnd *pwndParent)
    {    if( ! m_strSelDir.IsEmpty() )
        {
            m_strSelDir.TrimRight();
            if( m_strSelDir.Right(1) == "\\" || m_strSelDir.Right(1) == "//" )
                m_strSelDir = m_strSelDir.Left(m_strSelDir.GetLength() - 1);
        }    LPMALLOC pMalloc;
        if (SHGetMalloc (&pMalloc)!= NOERROR)
            return FALSE;    BROWSEINFO bInfo;
        LPITEMIDLIST pidl;
        ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));    if (!m_strInitDir.IsEmpty ())
        {
            OLECHAR       olePath[MAX_PATH];
            ULONG         chEaten;
            ULONG         dwAttributes;
            HRESULT       hr;
            LPSHELLFOLDER pDesktopFolder;
            //
            // Get a pointer to the Desktop's IShellFolder interface.
            //
            if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
            {
                //
                // IShellFolder::ParseDisplayName requires the file name be in Unicode.
                //
                MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_strInitDir.GetBuffer(MAX_PATH), -1,
                                    olePath, MAX_PATH);            m_strInitDir.ReleaseBuffer (-1);
                //
                // Convert the path to an ITEMIDLIST.
                //
                hr = pDesktopFolder->ParseDisplayName(NULL,
                                                    NULL,
                                                    olePath,
                                                    &chEaten,
                                                    &pidl,
                                                    &dwAttributes);
                if (FAILED(hr))
                {
                    pMalloc ->Free (pidl);
                    pMalloc ->Release ();
                    return FALSE;
                }
                bInfo.pidlRoot = pidl;        }
        }
        bInfo.hwndOwner = pwndParent == NULL ? NULL : pwndParent->GetSafeHwnd();
        bInfo.pszDisplayName = m_strPath.GetBuffer (MAX_PATH);
        bInfo.lpszTitle = (m_strTitle.IsEmpty()) ? "Open" : m_strTitle;
        bInfo.ulFlags = BIF_RETURNFSANCESTORS
                        | BIF_RETURNONLYFSDIRS
                        | (m_bStatus ? BIF_STATUSTEXT : 0);    bInfo.lpfn = BrowseCtrlCallback;  // address of callback function
        bInfo.lParam = (LPARAM)this;      // pass address of object to callback function    if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)
        {
            return FALSE;
        }
        m_strPath.ReleaseBuffer();
        m_iImageIndex = bInfo.iImage;    if (::SHGetPathFromIDList(pidl, m_strPath.GetBuffer(MAX_PATH)) == FALSE)
        {
            pMalloc ->Free(pidl);
            pMalloc ->Release();
            return FALSE;
        }    m_strPath.ReleaseBuffer();    pMalloc ->Free(pidl);
        pMalloc ->Release();    return TRUE;
    }
      

  8.   

    //调用   CDirDialog dlgDir;   dlgDir.m_strTitle = _T("Select directory for file search");
       UpdateData(TRUE);
       dlgDir.m_strSelDir = "C:\\";
       dlgDir.m_strWindowTitle = _T("Select directory");
       if (dlgDir.DoBrowse(this) == IDOK) {
          m_Edit1 = dlgDir.m_strPath;          //将文件路径写到编辑控件中
          // Append backslash if necessary
          UpdateData(FALSE);
       }
      

  9.   

    BROWSEINFO bi = {0};
        LPITEMIDLIST pidl;
        IMalloc *pMalloc = NULL;
        char cszPath[MAX_PATH]; bi.hwndOwner = m_hWnd;
    bi.lpszTitle = "Title";
    bi.ulFlags = BIF_RETURNONLYFSDIRS;
    pidl = SHBrowseForFolder(&bi);
    if (pidl)
    {
    if (SHGetPathFromIDList(pidl, cszPath))
    {     // Get Dir
    }

    if (SHGetMalloc(&pMalloc))
    {
    pMalloc->Free(pidl);
    pMalloc->Release();
    }
    }