【MFC学习一】BROWSEINFO选择路径导出文件

 

mfc中使用 BROWSEINFO,使用

bi.lpfn = BrowseCallbackProc;

回调指定默认当前程序所在目录,导出csv文件,注意处理文件内容中的逗号、单引号、数字字符串开头有0的情况。

int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
    switch(uMsg)
    {
    case BFFM_INITIALIZED:
        ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
        break;
    }

    return 0;
}

unsigned selDir( string &strDir,void *hwnd/* = NULL*/ )
{
    char szDir[MAX_PATH];
    BROWSEINFO bi; 
    bi.hwndOwner = (HWND)hwnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = szDir;
    bi.lpszTitle = "选择导出位置:";
    bi.iImage = 0;

    bi.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
    bi.lpfn = BrowseCallbackProc;
    bi.lParam = (LPARAM)(LPCTSTR)strDir.c_str();

    LPITEMIDLIST lp = SHBrowseForFolder(&bi);
    if (lp && SHGetPathFromIDList(lp,szDir))
    {
        strDir = szDir;
        return IDOK;
    }

    return IDCANCEL;
}
//将数据项写入CSV文件
int PutCSVItemLine(FILE *file, CStringArray &sItemLine)
{
    //准备行数据
    CStringA sLineString;

    //循环取子项
    for(INT_PTR nItem=0; nItem<sItemLine.GetSize(); nItem++)
    {
        //取子项
        CStringA sItem(sItemLine.GetAt(nItem));

        //查找是否包含引号或逗号
        if(sItem.FindOneOf("\",\r\n") >= 0)
        {
            //单引号替换为双引号
            sItem.Replace("\"", "\"\"");

            //首尾用引号包含
            sItem.Insert(0, "\""); sItem += "\"";
        }

        //添加逗号分隔符
        if(!sLineString.IsEmpty()) sLineString += ",";

        //追加数据
        sLineString += sItem;
    }

    //行尾添加\r\n
    sLineString += "\r\n";

    //写入文件
    return (int) fwrite((LPCSTR)sLineString, 1, sLineString.GetLength(), file);

}
void DLG_FuncPwdList::OnBnClickedExport()
{
    // TODO: 在此添加控件通知处理程序代码
        TCHAR sDir[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, sDir);
    CString cDir;
    cDir.Format(_T("%s"),sDir);
    std::string strDir = cDir;
    if (IDOK == selDir(strDir,GetSafeHwnd()))
    {
        /*CString str;
        str.Format(_T("选择的目录为 %s"),  strDir.c_str());
        AfxMessageBox(str);*/
        CString FileName;
        SYSTEMTIME t;
        GetLocalTime(&t);
        FileName.Format(_T("%s\\功能密码%d%d%d%d%d%d.csv"),strDir.c_str(),t.wYear,t.wMonth,t.wDay, t.wHour, t.wMinute, t.wSecond);

        FILE *f = NULL;
        if(_tfopen_s(&f, FileName, _T("wb")) == 0)
        {
            //标题
            CStringArray sLine;
            sLine.Add(_T("序号"));
            sLine.Add(_T("功能名称"));
            sLine.Add(_T("密码"));
            PutCSVItemLine(f, sLine);
            for(int i=0;i<FuncPwdList.size();i++)
            {
                sLine.RemoveAll();
                CString tmp;
                tmp.Format(_T("%d"),FuncPwdList[i].FuncId);
                sLine.Add(tmp);
                sLine.Add(FuncPwdList[i].FuncName);
                tmp.Format(_T("\t%s\t"),FuncPwdList[i].Pwd);//处理开头为0的数字字符串
                sLine.Add(tmp);
                PutCSVItemLine(f, sLine);
            }
            fclose(f);
        }
        CString msg = "导出成功!文件路径:" + FileName;        
        AfxMessageBox(msg);
    }
    return;
}

 

posted @ 2022-01-12 13:49  双手在忙  阅读(509)  评论(0)    收藏  举报