我想在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);
}
}
这个问题是,当我选择单个文件时,它会给出文件名,但是当我选择多个文件时,它不会给出任何文件名吗?
我不知道原因?
答案 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);
行。