// 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 逐个复制到二维数组,就能获取所有选中的文件的文件名。
对于选择了多个文件的情况得到第一个文件位置。 POSITION pos = Filedlg.GetStartPosition();// 这里返回的pos是个地址,这个地址里保存的就是选中的文件的文件路径和文件名,路径与文件名之间用‘.’就是0隔开的。 如pos=0x33f104,查看该地址如下图,保存的就是文件路径 如下图选中4个文件
FileName = Filedlg.GetNextPathName(pos);//返回选定文件文件名 这个函数返回的就是上面pos的地址里的文件路径,并将pos设置到下一个选中的文件路径的地址