正文

CFileDialog多选的最大文件数2011-08-01 16:34:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/52699.html

分享到:

         近期因为建库,需要一次性提交很多文件,经常发现list最终显示不完整,只有一部分。想想应该是与CFileDialog支持多选的最大文件数有关。             我们知道,使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。         再来看看MSDN上的CFileDialog中变量的解释吧:     nMaxFile: 说明 lpstrFile 缓冲指针的大小,以 TCHARs 为单位。对于 ANSI 版本,它指的是字节数。对于 Unicode 版本,它指的是字符数,该缓冲必须足够大才能存储文件的路径字符串,包括结尾空字符。如果 该缓存太小以至于无法包含文件信息,那么 GetOpenFileName 和 GetSaveFileName 函数将返回 FALSE。该缓冲至少要求容纳 256 个字符。       如此,只要我们设置足够大的缓冲空间就可以了,看看自己的代码,都是简单设置为40000,不具有通用性,因为每个文件的路径名可能长度都不同,看网友比较好的方法是这样的:(假设每个文件名支持的最大的路径名是255)可以一眼看出最多支持选择2000个文件;    CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL); DWORD MAXFILE = 2000 * 256; dlg.m_ofn.nMaxFile = MAXFILE; char* pc = new char[MAXFILE]; dlg.m_ofn.lpstrFile = pc; dlg.m_ofn.lpstrFile[0] = NULL; int iReturn = dlg.DoModal(); if(iReturn == IDOK) {     int nCount = 0;     POSITION pos = dlg.GetStartPosition();     while (pos != NULL)     {         dlg.GetNextPathName(pos);         nCount++;     }     CString str;     str.Format("Successfully opened %d files ", nCount);     AfxMessageBox(str); } else if(iReturn == IDCANCEL)     AfxMessageBox("Cancel"); if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)     AfxMessageBox("BUFFERTOOSMALL"); delete []pc;          

阅读(7006) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册