// Create dialog to open multiple files.
CFileDialog Filedlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT | OFN_EXPLORER, _T(“TBL文件(.TBL)|.TBL||”));
// .OFN_ALLOWMULTISELECT,允许多选
const int nMaxFiles = 100;
const int nMaxPathBuffer = (nMaxFiles * (MAX_PATH + 1)) + 1;
LPSTR pc = (LPSTR)malloc(nMaxPathBuffer * sizeof(CHAR));//申请空间存放打开的文件名
memset(pc, 0, nMaxPathBuffer * sizeof(CHAR));
if (pc)
{
Filedlg.m_ofn.lpstrFile = pc;//将上面的内存地址复制给CFileDialog对象
Filedlg.m_ofn.nMaxFile = nMaxPathBuffer * sizeof(CHAR);//此最大数,按MSDN解释为fileDlg.m_ofn.lpstrFile指向的缓冲的最大字符数
//这里是关键,Filedlg.m_ofn.nMaxFile的默认空间长度是260,超过260将不显示,这个是造成多选不显示的原因
}
if (IDOK == Filedlg.DoModal())
{
CString FileName;
POSITION pos = Filedlg.GetStartPosition();// .GetStartPosition,对于选择了多个文件的情况得到第一个文件位置。
while (pos != NULL)
{
FileName = Filedlg.GetNextPathName(pos);//返回选定文件文件名// Retrieve file name(s).
}
}
如上面的代码通过一个全局的二维数组,将FileName 逐个复制到二维数组,就能获取所有选中的文件的文件名。
说明:
OFN_ALLOWMULTISELECT,允许多选,必须设置
GetStartPosition
对于选择了多个文件的情况得到第一个文件位置。
POSITION pos = Filedlg.GetStartPosition();// 这里返回的pos是个地址,这个地址里保存的就是选中的文件的文件路径和文件名,路径与文件名之间用‘.’就是0隔开的。
如pos=0x33f104,查看该地址如下图,保存的就是文件路径
如下图选中4个文件
GetNextPathName
FileName = Filedlg.GetNextPathName(pos);//返回选定文件文件名
这个函数返回的就是上面pos的地址里的文件路径,并将pos设置到下一个选中的文件路径的地址