posts - 32, comments - 59, trackbacks - 0, articles - 2
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

用CFile实现文件拷贝

Posted on 2005-06-28 18:56 这里的黄昏静悄悄 阅读(2528) 评论(1)  编辑 收藏 引用 所属分类: MFC/SDK
熟悉CFile和CFileDialog类的使用。选择源文件和目标文件,然后执行拷贝工作。如下图所示
copyfile.jpg
下面说一下具体的实现。
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啦,简单吧。自己也试试吧。

Feedback

# re: 用CFile实现文件拷贝  回复  更多评论   

2009-08-10 14:44 by enjon
有没搞错啊,字都看不清楚太小了
只有注册用户登录后才能发表评论。