CFileDialog如何打开很多个文件,不是几个。

neverfor 2005-10-14 06:36:16
我的程序需要用CFileDialog打开很多文件,大概有好几百个,虽然设置了multiselect,但是打开文件太多时总是出错。请问怎么解决。
...全文
358 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxiong66 2005-12-16
  • 打赏
  • 举报
回复
goodboyws(深夜不眠者)
谢谢你的方法,我使用你的代码单多选都能通过,支持你
Kudeet 2005-11-24
  • 打赏
  • 举报
回复
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。
lucker888 2005-11-24
  • 打赏
  • 举报
回复
同意:zxyjyzxyjy(星星)
我也试过当把缓冲区的大小设置为n*1024*1024时,多选正确,单选时dlg.DoModal()反回不等于IDOK。
当把缓冲区的大小设置为n*1023*1023时,多选单选都正确。
zzg315 2005-10-16
  • 打赏
  • 举报
回复
打开多个问题出错,是内存分配的不够,这是我的代码,可以控制错误:
DWORD MAXFILE = 8000;
filedlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
filedlg.m_ofn.lpstrFile = pc;
filedlg.m_ofn.lpstrFile[0] = NULL;


int iReturn = filedlg.DoModal();

if(iReturn == IDOK)
{
POSITION pos = filedlg.GetStartPosition();
while (pos != NULL)
{
str=filedlg.GetNextPathName(pos);
......
}

}

if(CommDlgExtendedError() == 0x3003)
AfxMessageBox("一次打开的文件数目过多!\n\n请分成多次添加。");
delete []pc;
zxyjyzxyjy 2005-10-15
  • 打赏
  • 举报
回复
这里微软网站上的列子,我的计算机512M内存,多个单个都行。
CFileDialog dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL );
DWORD MAXFILE = 256200; //2562 is the maxOFN_ALLOWMULTISELECT
dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = NULL;
CString str;
int iReturn = dlg.DoModal();
if(iReturn == IDOK)
{
int nCount = 0;
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
{
str += dlg.GetNextPathName(pos);
nCount++;
}
AfxMessageBox(str);
}
delete []pc;



goodboyws(深夜不眠者)这个兄弟的,在我计算机上我把8*1024*1024改为8*1024*500则单选多选都行,如不改这里也是不能选一个的情况,真怪真怪,就是在CFileDialog::DoModal()内部调用::GetOpenFileName(&m_ofn)时反回假?????是不是在微软内部做这个函数时有一个对单选与多选文件做了个开关什么的东西????????
蒋晟 2005-10-15
  • 打赏
  • 举报
回复
http://blog.joycode.com/jiangsheng/archive/2004/11/22/39413.aspx
goodboyws 2005-10-15
  • 打赏
  • 举报
回复
我的代码没有这个问题,单选多选都测试通过了的,还是仔细找一下你的原因吧
zxyjyzxyjy 2005-10-15
  • 打赏
  • 举报
回复
不好意思,本人明白了是怎么回事了。如下

dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE+1];
zxyjyzxyjy 2005-10-15
  • 打赏
  • 举报
回复
在本人的计算机上,本人试了:

goodboyws(深夜不眠者)

的方法,以及本人贴出的方法,发现一个奇怪的现象,谁能解释这是什么原因:


当把缓冲区的大小设置为n*1024*1024时,多选正确,单选时dlg.DoModal()反回不等于IDOK。
当把缓冲区的大小设置为n*1023*1023时,多选单选都正确。
xiaoyelang 2005-10-14
  • 打赏
  • 举报
回复
goodboyws(深夜不眠者) 你好,你那个好像不能打开单个文件的,有啥办法也能打开单个文件的呢
菜牛 2005-10-14
  • 打赏
  • 举报
回复
打开一个文件和多个文件要分开处理的。建议好好看看函数参数。
goodboyws 2005-10-14
  • 打赏
  • 举报
回复
不可能,你试过么
neverfor 2005-10-14
  • 打赏
  • 举报
回复
goodboyws(深夜不眠者)
按你的方法,打开一个文件的时候又不对了。
neverfor 2005-10-14
  • 打赏
  • 举报
回复
楼上的请问
Filedlg.m_ofn.lStructSize = 88;
有什么用?
xiaoyelang 2005-10-14
  • 打赏
  • 举报
回复
CString strpath;
CFileDialog Filedlg(TRUE,NULL,NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT | OFN_EXPLORER,"BMP Files (*.bmp)|All files (*.*)|*.*|",NULL);
TCHAR *pBuffer = new TCHAR[MAX_PATH * 100];//最多允许100个文件
Filedlg.m_ofn.lpstrFile = pBuffer;
Filedlg.m_ofn.nMaxFile = 100*MAX_PATH;
Filedlg.m_ofn.lStructSize = 88;

if(Filedlg.DoModal() == IDOK){
POSITION pos = Filedlg.GetStartPosition();
while(pos != NULL){

strpath = Filedlg.GetNextPathName(pos);

}
}
goodboyws 2005-10-14
  • 打赏
  • 举报
回复
CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT
|OFN_HIDEREADONLY | OFN_PATHMUSTEXIST
| OFN_OVERWRITEPROMPT,
NULL,this);
TCHAR* szPathMulti = new TCHAR[8*1024* 1024]; //尽量给大些
dlg.m_ofn.nMaxFile = 8*1024* 1024;
dlg.m_ofn.lpstrFile = szPathMulti;
dlg.m_ofn.lpstrFile[0] = 0;

if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();
while(pos)
{
szFileName=dlg.GetNextPathName(pos);
//这个就是文件名
}
}
delete[] szPathMulti;
goodboyws 2005-10-14
  • 打赏
  • 举报
回复
估计是缓冲区给小了
CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT
|OFN_HIDEREADONLY | OFN_PATHMUSTEXIST
| OFN_OVERWRITEPROMPT,
NULL,this);
TCHAR* szPathMulti = new TCHAR[8*1024* 1024]; //尽量给大些
dlg.m_ofn.nMaxFile = 8*1024* 1024;
dlg.m_ofn.lpstrFile = szPathMulti;
dlg.m_ofn.lpstrFile[0] = 0;

if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();
while(pos)
while(pos)
{
szFileName=dlg.GetNextPathName(pos);
//这个就是文件名
}
}
delete[] szPathMulti;
tanghui0512 2005-10-14
  • 打赏
  • 举报
回复
自己设计一个吧
Stefine 2005-10-14
  • 打赏
  • 举报
回复
什么程序啊?

技术问题可能帮不了你

呵呵,也问问,不介意吧

关注ing

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧