最近在写一个小工具,用到了CFileDialog,用来实现复选文件名。
按照一般的做法:
CFileDialog SELECTDIALOG(TRUE, "", NULL,
OFN_ALLOWMULTISELECT|OFN_OVERWRITEPROMPT,
"*.*|*.*|所有文件(*.*)|*.*|", NULL);
SELECTDIALOG.m_ofn.lpstrTitle = "请选择该组件内包含的文件(***友情提醒:支持复选***)";
SELECTDIALOG.m_ofn.lpstrInitialDir = "...";
SELECTDIALOG.DoModal();
这样的话只能支持单选文件,无法实现复选,查了下msdn,加了如下代码:
CString szFile = "";
CString szFileName = "";
POSITION pon;
pon = SELECTDIALOG.GetStartPosition();
while (NULL != pon)
{
szFile = SELECTDIALOG.GetNextPathName(pon);
szFileName = GetFileName(szFile);
if (szFileName == "")
{
continue;
}
else
{
ComponentFile.push_back(szFileName);
}
}
因为只需要得到文件名,路径不需要,所以加了个 CString GetFileName(CString szFile)滤去路径。
CString CSetComponentListDlg::GetFileName(CString szFile)
{
char PathTemp[256] = "";
char FileName[256] = "";
strncpy(PathTemp, szFile, sizeof(PathTemp));
for (int i = 0, j = 0, flag = 0; i < sizeof(PathTemp); i ++)
{
if (PathTemp[i] != '//')
{
FileName[j] = PathTemp[i];
j ++;
}
else
{
flag = i;
j = 0;
strcpy(FileName, "");
}
}
return FileName;
}
编译,ok,测试下,出问题了: 能支持复选,读进来的文件名也对,可是很奇怪,只能同时复选12个左右的文件,
一次选择多于12个文件就会出错,百思不得奇解,继续查msdn,原来有个文件缓存用来放这些文件名,文件缓存
默认状态下比较小,放的文件名多了就溢出了。
把开头那段加入文件缓存的定义:
char FileBuff[6400] = "";
CFileDialog SELECTDIALOG(TRUE, "", NULL,
OFN_ALLOWMULTISELECT|OFN_OVERWRITEPROMPT,
"*.*|*.*|所有文件(*.*)|*.*|", NULL);
SELECTDIALOG.m_ofn.lpstrTitle = "请选择该组件内包含的文件(***友情提醒:支持复选***)";
SELECTDIALOG.m_ofn.lpstrInitialDir = "...";
SELECTDIALOG.m_ofn.lpstrFile = FileBuff;
SELECTDIALOG.m_ofn.nMaxFile = sizeof(FileBuff);
SELECTDIALOG.DoModal();
重新编译,测试,一切ok。
总结一下: 即使是个很小的东西也有很多讲究的地方。