VC打开文件对话框2007-12-26 18:19try
{
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();
}
CString strOldPath;
CString strNewPath;
char szCurrentPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,szCurrentPath);
strOldPath.Format("%s//Database//Demo.mdb",szCurrentPath);
CFileDialog dlg(FALSE, _T( ".mdb" ), _T( "DataDemo.mdb" ), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T( "Access数据库|*.mdb|所有文件|*||" ) );
if ( dlg.DoModal() == IDOK )
{
strNewPath = dlg.GetPathName();
MessageBox(strOldPath);
MessageBox(strNewPath);
strNewPath.Replace("//","");
strOldPath.Replace("//","");
MessageBox("数据库备份成功!");
::CopyFile(strOldPath,strNewPath,FALSE);
}
今天,又看了这些东西,在VC里面创建浏览文件对话框比创建浏览文件夹对话框要简单一些。
一、创建“浏览文件对话框”
用CFileDialog类实现,比如:
CFileDialog FDlg(TRUE , ".doc" , NULL , OFN_HIDEREADONLY , "word文件(*.doc)|*.doc|所有文件(*.*) |*.*||" );
if(FDlg.DoModal() == IDOK)
{
filePath = FDlg.GetPathName();
UpdateData(false);
filePath.Replace("//","");
}
CFileDialog文件选择对话框的使用:
首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog(
BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框
LPCTSTR lpszDefExt = NULL, //默认的文件扩展名
LPCTSTR lpszFileName = NULL, //默认的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格
LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名
CWnd* pParentWnd = NULL //父窗口句柄指针
);
LPCTSTR lpszFilter 参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
二、创建“浏览文件夹的对话框”
这个没办法用CFileDialog类来实现了,可以用回调函数,如下:
CString sFolderPath;
BROWSEINFO bi;
char Buffer[MAX_PATH];
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot =NULL;//初始化制定的root目录很不容易,
bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = "修改接收路径";
//bi.ulFlags = BIF_BROWSEINCLUDEFILES;//包括文件
bi.ulFlags = BIF_EDITBOX;//包括文件
bi.lpfn = NULL;
bi.iImage=IDR_MAINFRAME;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
//取得文件夹路径到Buffer里
sFolderPath = Buffer;//将文件夹路径保存在一个CString对象里
}
LPMALLOC lpMalloc;
if(FAILED(SHGetMalloc(&lpMalloc)))
return;
lpMalloc->Free(pIDList);
lpMalloc->Release();
MessageBox(sFolderPath,"Title",MB_OK);
三、创建可以多选的“浏览文件对话框”
使用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();
CString FileName;
while (pos != NULL)
{
FileName = dlg.GetNextPathName(pos);
AfxMessageBox(FileName); //显示所选的多个文件的路径
nCount++; //记录所选文件的数目
}
CString str;
str.Format("Successfully opened %d files/n", nCount);
AfxMessageBox(str);
}
else if(iReturn == IDCANCEL)
AfxMessageBox("Cancel");
if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
AfxMessageBox("BUFFERTOOSMALL");
delete [] pc;
看起来还是比较麻烦的,有可能是因为我们没有认真地去弄明白里面的每一个参数到底是干什么用的,所以看到这么多参数,就感觉不舒服,我也是。当然,如果去看看这些类是怎么回事,倒会好些。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/one_dollar/archive/2009/07/28/4388195.aspx
我程序当前目录有个datebase文件里,里面有demo.mdb
我想通过下面的代码将他复制出来,但MESSAGEBOX提示成功了,文件却没复制,怎么回事???
C/C++ code
CString strOldPath;
CString strNewPath;
char szCurrentPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,szCurrentPath);
strOldPath.Format("%sDatabaseDemo.mdb",szCurrentPath);
CFileDialog dlg(FALSE, _T( ".mdb" ), _T( "DataDemo.mdb" ), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T( "Access数据库|*.mdb|所有文件|*||" ) );
if ( dlg.DoModal() == IDOK )
{
strNewPath = dlg.GetPathName();
MessageBox(strOldPath);
MessageBox(strNewPath);
strNewPath.Replace("","");
strOldPath.Replace("","");
MessageBox("数据库备份成功!");
::CopyFile(strOldPath,strNewPath,FALSE);
}