Posted on 2005-06-28 18:56
这里的黄昏静悄悄 阅读(2555)
评论(1) 编辑 收藏 引用 所属分类:
MFC/SDK
熟悉CFile和CFileDialog类的使用。选择源文件和目标文件,然后执行拷贝工作。如下图所示
下面说一下具体的实现。
1、用向导生成一个基于对话框的MFC应用程序,然后按照上图添加控件:2个static控件,2个Edit控件,3个Button控件。然后为3个Button控件添加鼠标单击的消息处理函数。
2、在Dlg.h中添加变量
DWORD dwRead;// 读取的字节数
char lpStrFile[50];// 文件名
char sPath[250];// 源文件路径
char dPath[250];// 目标文件路径
char szBuffer[1024];
3、在Dlg.cpp中添加代码
首先要加入#include "afxdlgs.h" 这样才能用CFileDialog类
在本例中不允许用户自己输入文件的路径,所以一开始要禁止输入,所以在OnInitDialog()中添加代码
GetDlgItem(IDC_EDIT1)->EnableWindow(false);
GetDlgItem(IDC_EDIT2)->EnableWindow(false);
在未选择源文件之前,不能选择目标文件,不能点击“CopyFile”按钮,所以再添加如下代码
GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
GetDlgItem(IDC_BUTTON3)->EnableWindow(false);
然后初始化dwRead变量
dwRead = 0;
4、好了,为OnBnClickedButton1()添加代码来选择源文件
首先我们要生成CFileDialog 类的实例m_OpenFileDlg,其中第一个参数决定了是打开还是保存对话框。
CFileDialog m_OpenFileDlg(1,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"text file(*.txt)|*.txt|picture file(*.jpg)|*.jpg|All file(*.*)|*.*||");
这样基本上就够了,不过我们仍然可以修改对话框的一些属性,不过必须在调用它的DoModal函数之前。
OPENFILENAME &openFile = m_OpenFileDlg.GetOFN();//注意这里是引用。
openFile.lpstrTitle = "Source File Path";
openFile.lpstrFilter = "All Files(*.*)|(*.*)";
openFile.lpstrInitialDir = "H:\\";
if(m_OpenFileDlg.DoModal()== IDOK)
{
CString filepath = m_OpenFileDlg.GetPathName();//获得文件路径名
SetDlgItemText(IDC_EDIT1,filepath);
memset(lpStrFile,0,50);//这个主要是为了在选择目标文件的时候用
strcpy(lpStrFile,m_OpenFileDlg.GetFileName());
memset(sPath,0,250);//清空,为了下次再用
strcpy(sPath,m_OpenFileDlg.GetPathName());
GetDlgItem(IDC_BUTTON2)->EnableWindow();//现在允许选择目标文件了。
}
接下来就是为OnBnClickedButton2()添加代码来选择目标文件了
CFileDialog m_SaveFileDlg(0,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"text file(*.txt)|*.txt|picture file(*.jpg)|*.jpg|All file(*.*)|*.*||");
基本上跟打开文件对话框类似,不过这里要修改默认的保存的文件名,这就要用到上面的文件名了
OPENFILENAME &openFile = m_SaveFileDlg.GetOFN();
openFile.lpstrTitle = "Dest File Path";
strcpy(openFile.lpstrFile ,lpStrFile);
//strcpy(openFile.lpstrDefExt,lpFileEx);
openFile.lpstrFilter = "All Files(*.*)|(*.*)";
openFile.lpstrInitialDir = "H:\\";
if(m_SaveFileDlg.DoModal()== IDOK)
{
CString filepath = m_SaveFileDlg.GetPathName();
SetDlgItemText(IDC_EDIT2,filepath);
memset(dPath,0,250);
strcpy(dPath,m_SaveFileDlg.GetPathName());
GetDlgItem(IDC_BUTTON3)->EnableWindow();
}
接下来是执行拷贝了,在OnBnClickedButtonCopy()中添加代码
CFile m_Source,m_Destine;
m_Source.Open(sPath,CFile::modeRead|CFile::shareDenyWrite,0);
m_Destine.Open(dPath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareExclusive,0);//没有的话就创建
do
{
memset(szBuffer,0,1024);
dwRead = m_Source.Read(szBuffer,1024);
m_Destine.Write(szBuffer,dwRead);
}
while(dwRead > 0);
m_Source.Close();
m_Destine.Close();
MessageBox("File Copy Success!");
return;
函数很简单,首先打开文件,然后读取写入最后关闭就OK啦,简单吧。自己也试试吧。