当前位置:松语文学 > 其他类型 >VC++_6.0程序设计从入门到精通最新章节 > VC++_6.0程序设计从入门到精通TXT下载
错误举报

第 44 章

  com 用于指定要删除文件的路径名,可以为相对路径也可以为绝对路径。

  注意该函数不能删除目录。如果指定的文件已打开或者文件不能被删除,Remove()函数

  将抛出异常。

  实例8-2:文件cāo作实例。源代码在光盘中“\08\实例8-2\FileManipulate”目录下。

  FileManipulate 示例是一个基于对话框的MFC 应用程序,其界面如图8-2 所示。该示例

  实现了文件的删除、复制和移动功能。选择好原始文件和目标文件(可以自行输入也可以单

  击对应的“打开”按钮打开文件对话框进行选择),然后单击对话框底部的按钮可以实现如下

  的文件cāo作:

  ? “删除原始文件”按钮:用于删除原始文件输入框所指定的文件。

  ? “复制”按钮:用于将原始文件复制到目标文件。

  ? “移动”按钮:用于将原始文件移动到目标文件。

  图8-2 “文件cāo作”对话框

  删除文件的代码在CFileManipulateDlg::OnDel()中,用到了CFile::Remove()静态成员函数

  进行删除。

  复制文件的代码在CFileManipulateDlg::OnCopy()中,其思想是将原始文件的内容分几次

  读入内存中,再将内存中的数据依次写入目标文件,代码如下:

  pSrcFile=new CFile(m_szSrcFile, CFile::modeRead); //原始文件

  枫叶文学网www.fywxw.com

  第8 章 文件cāo作

  ·201·

  pDstFile=new CFile(m_szDstFile, CFile::modeCreate|

  CFile::modeWrite); //目标文件

  int nRead; //读取的字节数

  char szBuffer[1024]; //复制缓冲区,用于将读取的数据缓存,然后写入

  //循环直到读取的字节数为0

  while (nRead=pSrcFile->Read(szBuffer,sizeof(szBuffer)))

  {

  pDstFile->Write(szBuffer,nRead);

  }

  pSrcFile->Close();

  pDstFile->Close();

  delete pSrcFile;

  delete pDstFile;

  移动文件的代码在CFileManipulateDlg::OnMove()中,其主要思想是将原始文件复制到目

  标文件后再删除原始文件。

  技巧:CFile::Remove()函数不能删除目录,而Windows API 提供了RemoveDirectory()函数,用于

  删除一个空目录,对于目录中的文件需要自行删除。MFC 中提供CFileFind 类用于枚举目

  录中的子文件, 使用这个类的功能枚举出目录中的所有文件并删除, 再使用

  RemoveDirectory()删除空目录即可完成删除目录的功能。

  下面介绍删除目录的详细过程。首先需要枚举目录文件。枚举目录文件是Windows 系统

  中一个重要的cāo作。枚举目录文件是通过CFileFind 类实现的。CFileFind 是MFC 中实现本地

  文件搜索的类,包含开始搜索,定位文件,获得的文件信息的成员函数。

  CFileFind 类的构造函数没有参数。而开始一个搜索,需要调用CFileFind::FindFile()函数。

  该函数打开一个文件搜索,原型为:

  virtual BOOL FindFile(

  LPCTSTR pstrNcom = NULL,

  DWORD dwUnused = 0

  );

  ? 参数pstrNcom:指定文件的搜索路径和搜索类型,即可以使用通配符“*”和“?”。

  如果给出NULL 值,则FindFile()进行“*.*”的搜索。

  ? 参数dwUnused:为CFileFind 的派生类保留,必须为0。

  ? 返回值:确定打开搜索是否成功,失败的话可以通过GetLastError 函数获得失败代码。

  打开搜索后,就可以使用CFileFind::FindNextFile()函数获得下一个文件。CFileFind::FindNextFile()

  函数原型为:

  virtual BOOL FindNextFile( );

  函数返回值用于确定是否还有文件没找到,如果为FALSE 则说明这是最后一个找到的

  文件或者出错,可以用GetLastError 函数获得出错信息。

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·202·

  搜索到一个文件时可以用下列一些函数获得文件的信息:

  ? GetCreationTcom():获得文件创建时间。

  ? GetFileNcom():获得文件名。

  ? GetFilePath():获得文件全路径。

  ? GetFileTitle():获得文件标题。

  ? GetLastAccessTcom():获得文件最后一次访问的时间。

  ? GetLastWriteTcom():获得文件最后一次被写入的时间。

  ? GetLength():获得文件字节大小。

  ? GetRoot():获得文件的根目录。

  ? IsArchived():确定文件是否是存档文件。

  ? IsDirectory():确定文件是否是目录。

  ? IsDots():确定文件是否是“.”或者“..”,这种类型的文件表示目录。

  ? IsHidden():确定文件是否是隐藏文件。

  ? IsNormal():确定文件是否是普通文件。

  ? IsReadOnly():确定文件是否是只读文件。

  ? IsSystem():确定文件是否是系统文件。

  ? IsTemporary():确定文件是否是临时文件。

  最后用CFileFind::Close()函数关闭搜索。

  介绍了CFileFind 类的使用方法后,可以想到,删除目录可以用递归的方法将目录中的

  所有子目录删除,即在本级目录中如果找到子目录文件,则调用自身删除这个子目录。代码

  如下:

  //CMyFile 是一个自定义功能的文件cāo作类

  //DeleteTree 函数用于删除目录,并同时删除目录中的所有子目录和文件

  //参数strDir 用于确定要删除的目录名

  void CMyFile::DeleteTree(CString strDir)

  {

  CFileFind finder; //创建一个目录搜索类

  CString delFile=strDir;

  delFile+="\\*.*"; //设置搜索目录的通配符

  //开始搜索,bWorking 用于表示是否搜索到新文件

  BOOL bWorking = finder.FindFile(delFile);

  //如果bWorking 为TRUE 则继续循环

  while (bWorking)

  {

  //获取下一个文件

  bWorking = finder.FindNextFile();

  //获取找到的文件名

  CString filencom=finder.GetFilePath();

  //如果文件是一个目录,而且不是一个“.”或者“..”的目录

  //那么删除这个子目录

  枫叶文学网www.fywxw.com

  第8 章 文件cāo作

  ·203·

  if(finder.IsDirectory()&&(!finder.IsDots()))

  {

  //递归调用自身删除子目录

  Delete(filencom);

  }

  else if (!finder.IsDots()) //如果文件不是一个“.”或者“..”的文件则删除该文件

  {

  CFile::Remove(filencom); //删除文件

  }

  }

  //文件查找完毕,所有文件都已经删除,目录清空

  RemoveDirectory(strDir); //删除空目录

  }

  8.3 文件对话框

  第4 章已经介绍过文件对话框的基本使用方法。现在介绍一些关于CFileDialog 的高级使

  用方法,包括多选文件对话框的使用方法和重载文件对话框的方法,使得程序能更灵活地控

  制文件对话框。

  8.3.1 多选文件对话框

  当构造CFileDialog 类时指定了OFN_ALLOWMULTISELECT 的属xìng,则CFileDialog 允

  许用户选择多个文件,如图8-3 所示。

  当设置允许多选的文件对话框时,与普通使用惟一的区别就是如何获得所有选定的文

  件。这就用到CFileDialog::GetStartPosition()和CFileDialog::GetNextPathNcom()两个函数。

  图8-3 可以多选的打开文件对话框

  CFileDialog::GetStartPosition()函数用于获得选择列表中的第一个文件路径名的位置,其

  原型为:

  POSITION GetStartPosition( ) const;

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·204·

  函数返回值用于枚举选择的文件。若为NULL,则说明选择列表为空。

  CFileDialog::GetNextPathNcom()函数用于获得下一个选择的文件名,其原型为:

  CString GetNextPathNcom(

  POSITION& pos

  ) const;

  ? 参数pos:指示前一个GetNexPathNcom()或GetStartPosition()函数设置的POSITION值。

  当GetNextPathNcom()调用返回时会修改该参数,如果值为NULL,则说明到达列表结

  尾。

  ? 函数返回值:获得下一个选择的文件路径名。

  于是可以得到下面的代码:

  //创建一个可以多选的文件对话框

  CFileDialog dlg(TRUE, NULL,NULL,OFN_ALLOWMULTISELECT);

  if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名

  {

  POSITION pos;

  pos= dlg.GetStartPosition(); //开始遍历用户选择列表

  while (pos!=NULL) //如果列表中还有新的文件

  {

  CString filencom=GetNextPathNcom(pos); //获得新的被选定的文件

  ?? //对filencom 的文件进行处理

  }

  }

  8.3.2 重载文件对话框

  当用户需要文件对话框有更多的功能,则可以通过重载CFileDialog 类,并为文件对话框

  添加新的控件完成。

  本节中以一个重载文件对话框的例子介绍重载的步骤。该例为文件对话框添加一个“删

  除”按钮,用于删除文件对话框中选定的文件,如图8-4 所示。

  实现这个自定义的文件对话框主要分为下列3 个步骤:

  图8-4 “打开”对话框

  枫叶文学网www.fywxw.com

  第8 章 文件cāo作

  ·205·

  1.创建一个对话框模板

  首先向工程的资源文件中创建一个新的对话框模板,将ID 设为IDD_MYFILEDIALOG。

  然后设置模板风格属xìng如图8-5 所示。

  图8-5 设置对话框模板的风格属xìng

  然后向模板中添加“删除”按钮,ID 设置为IDC_DEL,并重新调整对话框的大小,如

  图8-6 所示。

  图8-6 为对话框模板添加控件

  注意,在图8-6 中可以看到,新添加包含“删除”按钮的对话框模板是放在文件对话框

  的底部。因此需要将对话框的模板设置为子窗口而且无边框,更重要的是要复选“Clip

  siblings”和“Clip children”两个属xìng,使得文件对话框的原始控件可以得到恰当的重绘。

  2.重载CFileDialog 类

  在ClassWizard 中创建一个CFileDialog 的派生类CMyFileDialog。然后修改CMyFileDialog

  的构造函数,代码如下:

  //构造函数创建一个新的打开文件对话框,没有后缀名过滤器和默认的后缀名

  //参数中设置OFN_ENABLETEMPLATE 用于从自定义模板中添加新的控件

  CMyFileDialog::CMyFileDialog() :

  CFileDialog(TRUE, NULL, NULL,

  OFN_FILEMUSTEXIST|OFN_ENABLETEMPLATE, NULL, NULL)

  {

  //设置文件对话框的模板为IDD_MYFILEDIALOG

  //这里有两个参数分别对应于老版本和新版

  松语文学免费小说阅读_www.16sy.com