MFC BROWSEINFO使用获取路径并且记忆打开路径

MFC中我们往往需要遍历某个路径下的某个相关类型的文件,这就需要获取目录,我们一般使用的 BROWSEINFO 获取路径信息默认都是从根目录开始展开,而CFileDialog获取的一般都是文件路径,也想过用CFileDialog获取文件路径,再剔除文件来获取目录,但始终不是所想要的那种效果。

下面通过BROWSEINFO获取路径,并且通过创建一个文件来保存每次打开的目录从而达到记忆路径功能。

 

1.设置一个全局变量来保存路径,这个是为了保证程序执行后的路径记忆:

static TCHAR g_szLastSelDir[MAX_PATH];

2.设置一个flag,程序执行以后就不用再从文件中来读取路径了,从上面的全局变量中读取路径。

static bool START_FLAG

3.获取路径程序如下

        char buf[255];    //用来保存得到的路径
    
        //程序开始时直接从文件中读取
    if(START_FLAG == false)
    {
        CString LastPath = LastPahtGet();    
        _tcscpy(g_szLastSelDir, LastPath);
    }
        //程序开始 设置flag
    START_FLAG = true;
    BROWSEINFO bi;
    LPITEMIDLIST lp;
    CString BufferStr = _T("");
    CString ShowBuffer = _T("");
    ShowBuffer.LoadString(IDS_PRC_INPUT);
    ZeroMemory(buf, sizeof(buf));
    bi.hwndOwner = m_hWnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = buf;
    bi.lpszTitle = ShowBuffer;
    bi.ulFlags = BIF_RETURNONLYFSDIRS;
    bi.lpfn = BrowseCallbackProc;//设置回调函数,实现记忆路径
    bi.lParam = 0;
    bi.iImage = 0;

    lp = SHBrowseForFolder(&bi);
    PRC_IN_FLAG = false;

    if(lp!=NULL) {
        SHGetPathFromIDList(lp,buf);
        if(START_FLAG == true)
        {
            _tcscpy(g_szLastSelDir, buf);//程序执行后,获取路径
        }
        PrcFileIntPath = CString(buf);
        LastPathSet(PrcFileIntPath);//每次打开目录,保存目录到文件
    }        

 4.再把获取路径和写路径的程序也贴出来吧

获取写路径到文件中
void LastPathSet(CString LastPath)
{
    CStdioFile    m_ReadMe;
    CString        LineGetString    =    _T("");
    CString        ReadMeInf[1000];
    bool        PathFlag        = false;
    int i = 0;
    int j = 0;
        //ReadMePath自己定义一个文件路径
    if( m_ReadMe.Open( ReadMePath, CFile::modeWrite|CFile:: modeCreate) ==0)
    {
        return;
    }
    else
    {
        m_ReadMe.WriteString(CString("LASTPATH:") + LastPath + CString("\\"));
        m_ReadMe.Close();
    }
}    
从文件中获取路径
CString LastPahtGet(void)
{
    CStdioFile    m_ReadMe;
    int i;
    CString        LineGetString    =    _T("");
    if( m_ReadMe.Open( ReadMePath, CFile::modeRead|CFile::typeBinary) ==0)
    {
        return NULL;
    }
    else
    {
        m_ReadMe.ReadString(LineGetString);
        if(LineGetString.Find(CString("LASTPATH:"))!=-1)
            {                
                LastPath = LineGetString.Mid(9,LineGetString.GetLength()-10);
            }
        m_ReadMe.Close();

        if(PathFileExists(LastPath))//判断该路径是否存在
        {
            return LastPath;
        }
        else
        {
            return CString("");
        }
    }
    return CString("");
}
路径文件中的字段
LASTPATH:C:\Documents and Settings\cnkangjb\デスクトップ\prc\

 

转载于:https://www.cnblogs.com/kangnux/p/3276300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC打开文件和文件夹 一、利用API实现打开文件对话框和利用MFC来实现打开文件对话框。 方法一:API部分: // OPENFILENAME ofn; // TCHAR szFile[MAX_PATH]; // ZeroMemory(&ofn,sizeof(ofn)); // ofn.lStructSize = sizeof(ofn); // ofn.lpstrFile = szFile; // ofn.lpstrFile[0] = TEXT('/0'); // ofn.nMaxFile = sizeof(szFile); // ofn.lpstrFilter = TEXT("all/0*.*/0jpg/0*.jpg/0bmp/0*.bmp/0"); //定义三个选项,all,text和exe // ofn.nFilterIndex = 1; //定义首选项是哪一个 // ofn.lpstrFileTitle = NULL; // ofn.nMaxFileTitle = 0; // ofn.lpstrInitialDir = NULL; // ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // if(GetOpenFileName(&ofn)) // { // ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,szFile); // } 方法二、MFC实现 // CFileDialog dlg(TRUE, NULL, NULL, // OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // NULL); // // if(dlg.DoModal() == IDOK) // { // szFilename = dlg.GetPathName(); // ::MessageBox(NULL,szFilename,NULL,MB_OK); // } 注意:打开文件的方式和打开文件夹的方式是不同的。打开文件的方式是不断的打开直到出现末端为文件,否则遇到文件夹还要继续打开。而打开文件夹则是只要选择到一个路径的文件夹就打开。 下面的这种方式是打开文件夹:MFC实现。 static TCHAR strDirName[MAX_PATH]; BROWSEINFO bi; CString szString = TEXT("选择一个源文件子文件夹"); bi.hwndOwner = ::GetFocus(); bi.pidlRoot = NULL; bi.pszDisplayName = strDirName; bi.lpszTitle = szString; bi.ulFlags = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST pItemIDList = ::SHBrowseForFolder(&bi); if(pItemIDList == NULL) { return ; } ::SHGetPathFromIDList(pItemIDList, strDirName); CString str = strDirName; if(str != "" && str.Right(1) != '//') str += '//'; ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,str);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值