现在的位置: 首页 > 综合 > 正文

打开多个文件 的对话框 转

2014年10月07日 ⁄ 综合 ⁄ 共 3282字 ⁄ 字号 评论关闭

1.
本人想得到在打开文件对话框中选择的文件个数,能后用一个循环得到所有
的文件名。但文件个数如何得到?
2.
POSITION pos=filedialog.GetStartPosition();
CString str1=filedialog.GetNextPathName();
为什么是一个那么大的一个值,是如何得到的。
在vc++如何得到打开文件对话框中选择的多个文件名相关解决方法:1、
1. 一个简单的办法是当 GetNextPathName() 后不再变化就说明已经遍历了所有文件..
   另...一定有函数得到文件个数的...查查 MSDN ....
2. 不明你说什么...
2、
用个变量累加,难道不行?
3、
在vc++如何得到打开文件对话框中选择的多个文件名推荐解答:
用GetFilePathName()
GetFielPathName(POSITION &pos)
若到列表尾,pos返回NULL
剩下的东西就看你如何处理了!
POSITION pos=filedialog.GetStartPosition();
pos得到的是列表中的一个文件路径名的位置!
4、
在vc++如何得到打开文件对话框中选择的多个文件名推荐解答:
打开文件系统对话框中,选择多个文件(CFileDialog)
CFileDialog dlg(TRUE,
 _T("*.txt"),
 NULL,
 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
 _T("file (*.txt)|*.txt||"),
 this);
int nOkCancel = dlg.DoModal();
if(nOkCancel == IDOK)
{
 // append file to list
 POSITION pos = dlg.GetStartPosition();
        while (pos != NULL)
        {
            CString strFilePath=dlg.GetNextPathName(pos);
 // find file path name yes or no in the list
 if(m_ctlChoiseFileLt.FindString(-1,strFilePath)==LB_ERR)
 {
  // no find string then append to list
  m_ctlChoiseFileLt.AddString(strFilePath);
 }
       }
}
5、
但本人想得到在打开文件对话框中选择的文件个数i,
CString str[FILES],
能后用一个循环for(int x=0;x<i,x++){ str[x]=dlg.GetNextPathName(pos);}
得到所有的文件名。文件个数如何得到?
6、
在vc++如何得到打开文件对话框中选择的多个文件名推荐解答:
agree with tengy1(逐日) && use_id(use_id)
对话框成员函数不会给你返回文件个数,只会返回一个链表的位置值,你必须顺序的根据位置来读出被选择文件,自己统计文件个数
7、
POSITION pos=filedialog.GetStartPosition();                           
CString str1=filedialog.GetNextPathName();                                
为什么pos是一个那么大的一个值,是如何得到的。
(本人在文档视图框架里也发现这种情况:POSITION vpos=pDoc->GetFirstViewPosition();)
 
8、
在vc++如何得到打开文件对话框中选择的多个文件名


 

 

try
{
CString str("",10000);//这是做为存放打开文件名和路径的字符串空间10000这个值的设置就觉得有些不妥当
   CFileDialog openfile(true,NULL,NULL,
    OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files(*.*)|*.*|",AfxGetMainWnd());
openfile.m_ofn.lpstrFile=str.GetBuffer(10000);
openfile.m_ofn.nMaxFile=10000;
openfile.m_ofn.lStructSize=sizeof(openfile.m_ofn);
CString pathname("",MAX_PATH);
CFileStatus status;
   openfile.DoModal();
POSITION mPos=openfile.GetStartPosition();
   while(mPos!=NULL){
    pathname=openfile.GetNextPathName(mPos);
    CFile::GetStatus(pathname,status);
    this->m_listresult.InsertItem(count++,pathname); //把包括路径在内的文件名写到一个list控件里
   }
}
catch (CException* e)
{
AfxMessageBox(_T("打开文件出错了!"));
e->Delete();
}

 

 


我写的函数如下,但为什么一次最多只能打开1960个文件?望高手解答:
void CRegexdlgDlg::OnOpenFile() 
{
 CString temp;
 int i=0;
 POSITION pos;
 CFileDialog dlg(TRUE,"","");
 //下面一行是设置打开文件对话框——使之可以打开多个文件
 TCHAR *pszFile = new TCHAR[MAX_PATH*MAX_PATH];
 memset(pszFile,0,sizeof(TCHAR)*MAX_PATH*MAX_PATH);
 dlg.m_ofn.lpstrFile = pszFile;
 dlg.m_ofn.nMaxFile = MAX_PATH*MAX_PATH; 

 dlg.m_ofn.Flags = OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLEHOOK;
 if(dlg.DoModal()==IDOK)
 {
 //把起首位置赋值给pos
 pos=dlg.GetStartPosition();
 //把打开的多个文件名赋值给fname数组
 while(pos!=NULL){fname[i]=dlg.GetNextPathName(pos);i++;}
 temp.Format("%d",i);
 temp="一共打开了"+temp+"个文件";
 AfxMessageBox(temp);
 }
}

问题补充:

在CString temp;下面加一句 CString fname[9999];不然会出错,呵呵!
CString temp;
CString fname[9999];

 

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

 

抱歉!评论已关闭.