正文

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;

 

 


 

 

 

阅读(4864) | 评论(0)


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

评论

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