从对话框中选择多个文件

时间:2015-02-16 12:36:50

标签: mfc

我想在MFC中启动一个对话框,选择多个文件并将此文件显示给用户,然后将此文件复制到另一个位置。

我已编写此代码以尝试实现此目的:

CFileDialog fOpenDlg(TRUE,"", " ", OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST, 
"Capture file (*.cap)|*.cap|", this);

fOpenDlg.m_pOFN->lpstrTitle="Import file";

fOpenDlg.m_pOFN->lpstrInitialDir="Desktop";

if(fOpenDlg.DoModal()==IDOK)
{
    POSITION pos=fOpenDlg.GetStartPosition();
    while(pos)
    {
        CString PathName=fOpenDlg.GetNextPathName(pos);
        CString strFileName=fOpenDlg.GetFilename();
        AfxMessageBox(strFileName);
    }
}

这个问题是,当我选择单个文件时,它会给出文件名,但是当我选择多个文件时,它不会给出任何文件名吗?

我不知道原因?

2 个答案:

答案 0 :(得分:0)

函数GetFileName不适用于多个所选文件(请参阅此MSDN页面,了解OFN_ALLOWMULTISELECT)的用法。

使用您已在代码段中执行的GetStartPosition / GetNextPathName功能。

如果您只想获取文件名,而不是每个文件的完整路径,请考虑使用splitpath函数,如下例所示:splitpath quesion on stackoverflow

编辑: 要结束获取文件名,您可以添加类似于以下的函数:

CString GetFileName(const CString& filePath)
{
    TCHAR   drive[_MAX_DRIVE];
    TCHAR   dir[_MAX_DIR];
    TCHAR   fname[_MAX_FNAME];
    TCHAR   ext[_MAX_EXT];

    _tsplitpath_s(filePath, drive, dir, fname, ext);

    CString fileName;
    fileName.Format(_T("%s%s"), fname, ext);
    return fileName;
}

然后用以下代码替换显示消息框的代码:

AfxMessageBox(GetFileName(PathName));

当我将它添加到您的代码示例中时,这对我有用。

答案 1 :(得分:0)

你想要的是:

CFileDialog fOpenDlg(TRUE,"", " ", OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST, 
"Capture file (*.cap)|*.cap|", this);

fOpenDlg.m_pOFN->lpstrTitle="Import file";

fOpenDlg.m_pOFN->lpstrInitialDir="Desktop";

if(fOpenDlg.DoModal()==IDOK)
{
    POSITION pos=fOpenDlg.GetStartPosition();
    while(pos)
    {
        CString PathName=fOpenDlg.GetNextPathName(pos);
        CString strFileName= ::PathFindFileName(PathName);
        AfxMessageBox(strFileName);
    }
}

注意CString strFileName= ::PathFindFileName(PathName);行。