VC的文件操作和文件对话框使用

本文详细介绍了使用MFC进行文件操作的方法,包括文件查找、文件对话框使用、文件读写及复制删除等,并通过具体实例展示了如何实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      各种关于文件的操作在程序设计中是十分常见,因而熟练的掌握文件操作是十分重要的。
(1)文件的查找
  当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。
CString strFileTitle;
CFileFind finder;
BOOL bWorking = finder.FindFile("C://windows//sysbkup//*.cab");
while(bWorking)
{
  bWorking=finder.FindNextFile();
  strFileTitle=finder.GetFileTitle();
}

(2)文件对话框的使用
  让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框,MFC的类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 //父窗口句柄指针
);

      该类还有一些经常用到的成员函数。创建文件对话框可以使用DoModal(),在返回OK后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1

(3)文件的读写
    文件的读写非常重要,下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法。
对文件进行读操作:
  char sRead[2];
  CFile mFile(_T("user.txt"),CFile::modeRead);
  if(mFile.GetLength()<2)
  return;
  mFile.Read(sRead,2);
  mFile.Close();

对文件进行写操作:
  CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
  mFile.Write(sRead,2);
  mFile.Flush();
  mFile.Close();

(4)大于64K文件的读写

      VC中访问大于65535字节的缓冲区需要Huge型指针,而在CFile类中,使用的是Far型的指针。由于Far型指针不具有跨段寻址的能力,因此限制了一次文件读写的长度小于65535字节。在MFC的CFile类中提供了两个未载入文档的函数,函数原型如下:
DWORD CFile::ReadHuge(void FAR *lpBuffer,DWORD dwCount);
void CFile::WriteHuge(const void FAR*lpBuffer,DWORD dwCount);
在这两个函数内部使用的都是Huge型指针来对传递的缓冲区进行寻址,因此可以读写大于65535字节的巨型数据。
      对于ReadHuge()和WriteHuge()函数需要的巨型缓冲区可以使GobalAlloc()来创建。实例:

      CString Namel("data1.dat"); 
      CString Name2("data2.dat");
      CFile MyFilel(Namel,CFile::modeRead);
      CFile MyFile2(Name2,CFile::modeCreate|CFile::modeWrite);
      DWORD Length=MyFile1.GetLength();
      void far *p=GlobalAlloc(0,Length);
      if(p=NULL)
      {
            AfxMessageBox("Alloc memory error!"); 
      }
      MyFile1.ReadHuge(p,Length);
      MyFile2.WriteHuge(p,Length);
      MyFile1.Close();
      MyFile2.Close();
      AfxMessageBox("File Copy Succeed!"); 

(5)文件的复制、删除等
  MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。

(6)综合实例

      结合以上文件和文件对话框的,举一个打开并载入文件的操作实例。

CFile Filetemp;      //文件
CFileDialog BinFile(
     TRUE,
     "FILE",
     "*.bin",
     OFN_HIDEREADONLY,
     NULL,
     NULL);       //创建一个文件对话框


if (BinFile.DoModal() == IDOK)   //如果点OK确认
{
       CString PathName = BinFile.GetPathName();   //获得文件的全路径
       if (Filetemp.Open(PathName,CFile::modeRead))    //如果打开文件成功
       {
              int len = Filetemp.GetLength();                 //获得流文件长度
              char *DataSource = (char*)malloc(len);
              memset(DataSource,0,len);                      //分配内存
              Filetemp.Read(DataSource,len);               //将文件内容读入内存
              OnSendOutFile(DataSource,len);               //发送文件数据

 

              free(DataSource);
              DataSource = NULL;                                  //如果使用完毕释放掉内存
        }
}

 

参考原文:http://blog.youkuaiyun.com/zhuang_rui/archive/2007/09/28/1804875.aspx

参考原文:http://www.busfly.cn/post/32.html

参考原文:http://blog.youkuaiyun.com/sgdgoodboy/archive/2008/03/26/2221005.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值