[转载] 使用CFileDialog选择多个文件

来源:互联网 发布:软件系统是指 编辑:程序博客网 时间:2024/05/20 01:09

使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。   

如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。   

以下是一个使用该类进行多文件名选择的例子。

#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL

CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL);
DWORD MAXFILE 
= 4000
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;
    
    
如果需要进一步的信息,可以参看:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cfiledialog.asp以及Q179372等有关信息。