我的程序需要用CFileDialog打开很多文件,大概有好几百个,虽然设置了multiselect,但是打开文件太多时总是出错。请问怎么解决。

解决方案 »

  1.   

    什么程序啊?技术问题可能帮不了你呵呵,也问问,不介意吧关注ing
      

  2.   

    估计是缓冲区给小了
    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;
      

  3.   

    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;
      

  4.   

    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);

    }
    }
      

  5.   

    楼上的请问
    Filedlg.m_ofn.lStructSize = 88;
    有什么用?
      

  6.   

    goodboyws(深夜不眠者) 
    按你的方法,打开一个文件的时候又不对了。
      

  7.   

    goodboyws(深夜不眠者) 你好,你那个好像不能打开单个文件的,有啥办法也能打开单个文件的呢
      

  8.   

    http://blog.joycode.com/jiangsheng/archive/2004/11/22/39413.aspx
      

  9.   

    这里微软网站上的列子,我的计算机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)时反回假?????是不是在微软内部做这个函数时有一个对单选与多选文件做了个开关什么的东西????????
      

  10.   

    在本人的计算机上,本人试了:goodboyws(深夜不眠者)的方法,以及本人贴出的方法,发现一个奇怪的现象,谁能解释这是什么原因:
    当把缓冲区的大小设置为n*1024*1024时,多选正确,单选时dlg.DoModal()反回不等于IDOK。
    当把缓冲区的大小设置为n*1023*1023时,多选单选都正确。
      

  11.   

    不好意思,本人明白了是怎么回事了。如下dlg.m_ofn.nMaxFile = MAXFILE;
    char* pc = new char[MAXFILE+1];
      

  12.   

    打开多个问题出错,是内存分配的不够,这是我的代码,可以控制错误:
    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;
      

  13.   

    同意:zxyjyzxyjy(星星) 
    我也试过当把缓冲区的大小设置为n*1024*1024时,多选正确,单选时dlg.DoModal()反回不等于IDOK。
    当把缓冲区的大小设置为n*1023*1023时,多选单选都正确。
      

  14.   

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

  15.   

    goodboyws(深夜不眠者)
    谢谢你的方法,我使用你的代码单多选都能通过,支持你