CFile文件操作类

今天看到一篇关于CFile介绍的文章,感觉不错,分享一下
原文地址:http://www.jizhuomi.com/software/234.html

CFile类概述
如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作。这些文件操作函数中有的最终还是调用了操作系统的API函数或者处理过程与之类似,例如在Windows系统中,fread函数就调用了API函数ReadFile。

Windows系统的API函数除了ReadFile,还有CreateFile、WriteFile等函数。而MFC基于面向对象的思想,将这些Windows API函数封装到了CFile类中,实现对文件的打开、关闭、读、写、获取文件信息等操作。使用CFile类对文件进行操作非常便捷。

CFile类的成员函数

CFile( );
CFile(HANDLE hFile);
CFile(LPCTSTR lpszFileName,UINT nOpenFlags);

以上三个成员函数都是CFile的构造函数,用于构造CFile对象。参数hFile为要关联到CFile对象的文件的句柄。参数lpszFileName为要关联到CFile对象的文件的相对路径或者绝对路径;参数nOpenFlags为文件访问选项的组合,通过各选项的按位或运算实现组合,下面的5个表列出了nOpenFlags参数可能取的选项:

下面的文件访问模式选项表中只能选择一个进行组合,默认取CFile::modeRead。

取值 描述
CFile::modeRead 只读方式访问文件
CFile::modeWrite 写入方式访问文件
CFile::modeReadWrite 读写方式访问文件

下面的文件共享模式选项表中也只能选择一个进行组合,默认的共享模式是CFile::shareExclusive。

取值 描述
CFile::shareDenyNone 允许其他进程对文件进行读写
CFile::shareDenyRead 不允许其他进程读取文件
CFile::shareDenyWrite 不允许其他进程写文件
CFile::shareExclusive 禁止其他进程对文件的所有访问

下面的文件创建模式选项列表中可选择第一个或两者都选进行组合。

取值 描述
CFile::modeCreate 如果文件不存在则创建文件,而如果存在则将它关联到此CFile对象并将长度截取为0
CFile::modeNoTruncate 如果文件不存在则创建文件,而如果存在则将它关联到此CFile对象而不进行截取

注意,选择CFile::modeNoTruncate时需要与CFile::modeCreate一起使用,即CFile::modeCreate | CFile::modeNoTruncate。

另外,还有一个文件缓冲选项列表和一个文件安全选项。文件缓冲选项不太常用,鸡啄米这里就不讲了,有兴趣的可以查阅MSDN。文件安全选项是CFile::modeNoInherit,意为禁止子进程继承使用此文件。

当然,在实际使用时,以上各个表并不是都要用到,大家可以根据自己的需要选择用哪个表,选择哪个选项。

virtual BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError = NULL);

打开文件。它通常与默认构造函数CFile::CFile()一起使用。参数lpszFileName和nOpenFlags同构造函数。参数pError为指向文件异常对象的指针,默认为NULL。

virtual void Close( );

关闭文件。如果你没有在执行析构函数前调用此成员函数关闭文件,则析构函数会为你关闭。

virtual UINT Read(void* lpBuf,UINT nCount);

读取文件数据到缓存。参数lpBuf是由用户提供的指向接收文件数据的缓存的指针;参数nCount为读取的最大字节数。返回值是实际读取到缓存的字节数,如果到达文件尾则返回值可能会小于nCount,此时继续读取的话,会返回0,所以通常我们都会判断返回值是否小于nCount或者等于0来确定是否到达文件尾。

virtual void Write(const void* lpBuf,UINT nCount);

将缓存中的数据写入文件。参数lpBuf也是由用户提供,指向包含写入数据的缓存的指针;参数nCount为缓存中要被写入文件的数据的字节数。

virtual ULONGLONG Seek(LONGLONG lOff,UINT nFrom);

在一个打开的文件中重定位文件指针。参数lOff为文件指针移动的字节个数,为正数时表示向文件尾移动,为负数时表示向文件开头移动;参数nFrom为lOff的基准位置,即由nFrom位置开始移动lOff个字节,它可以取下面几个值中的一个:
CFile::begin 从文件开头开始移动
CFile::current 从文件指针的当前位置开始移动
CFile::end 从文件尾开始移动

文件打开时,文件指针被置于0,即文件开头处。

如果此函数成功则返回文件指针的位置。

void SeekToBegin( );

将文件指针移动到文件开头。它等价于Seek( 0L, CFile::begin )。

ULONGLONG SeekToEnd( );

将文件指针移动到文件末尾。返回值是文件的字节长度。它等价于CFile::Seek( 0L, CFile::end )。

virtual ULONGLONG GetLength( ) const;

获取文件的字节长度。

virtual void SetLength(ULONGLONG dwNewLen);

改变文件的长度。参数dwNewLen为文件的新长度,它可能比文件的当前长度值要大或者小,文件会相应的被扩展或截取。

virtual CString GetFileName( ) const;

获取文件名称。

virtual CString GetFilePath( ) const;

获取文件的绝对路径。

virtual CString GetFileTitle( ) const;

获取文件的显示名称。举个例子,与GetFileName区分一下,如果你系统中的文件不显示扩展名,则它获取到的文件名称就不包含扩展名,否则就显示扩展名。

virtual ULONGLONG GetPosition( ) const;
获取文件指针的当前位置。

static void PASCAL Remove(LPCTSTR lpszFileName,CAtlTransactionManager* pTM = NULL);

删除文件。参数lpszFileName为要删除的文件路径,可以是相对路径、绝对路径或者网络路径;参数pTM指向一个CAtlTransactionManager对象。

static void PASCAL Rename(LPCTSTR lpszOldName,LPCTSTR lpszNewName,CAtlTransactionManager* pTM = NULL);

重命名文件。参数lpszOldName为老的文件路径;参数lpszNewName为新的文件路径;参数pTM指向一个CAtlTransactionManager对象。实际上此函数的意义已经不只是重命名文件,还可以移动文件到其他目录下,例如,lpszOldName取"d:\1.txt",lpszNewName取"e:\2.txt",这样可以将D盘中的1.txt文件转移到E盘并重命名为2.txt。

CFile类应用实例

这里鸡啄米只给大家演示几个简单的代码片段,从这些代码片段中熟悉CFile类的文件操作。

实例一:构造CFile对象时就打开文件,然后向文件中写入数据,最后以Seek函数移动文件指针,读取文件内容。

C++代码

char writeBuffer[500];     // 要写入的数据的缓存
char readBuffer[500];      // 存放读取数据的缓存
LONGLONG lOff = 0;         // 文件指针的偏移量,也是读取到的数据的总字节数
// 构造CFile对象,同时以创建和读写的方式打开文件E:\1.txt
CFile file(_T("e:\\1.txt"), CFile::modeCreate | CFile::modeReadWrite);   // 将写入数据的缓存中每个字节都赋值为字符c
memset(writeBuffer, 'c', sizeof(writeBuffer));
// 将数据写入到文件中
file.Write(writeBuffer, sizeof(writeBuffer));   while (true)
{   // 以文件开头为基准,移动文件指针到lOff的位置   file.Seek(lOff, CFile::begin);   // 读取100个字节的数据到存放读取数据的缓存的readBuffer + lOff位置处   int nRet = file.Read(readBuffer + lOff, 100);   // 根据实际读取的字节数,增加文件指针的移动量   lOff += nRet;   // 如果读取数据时返回值小于指定的100,说明已到文件尾,跳出循环   if (nRet < 100)   break;
}   // 关闭文件
file.Close();

实际上,在Write函数和Read函数执行后,文件指针会自动移动到最后操作的位置,所以其实上面的代码中无须使用Seek函数再去手动移动文件指针。这将在下面的实例二中体现出来。

实例二:构造CFile对象,然后使用Open成员函数打开文件,再写入一个结构体数组,最后读取出来。

先贴上结构体的定义:
C++代码

struct student
{   int  nNum;     float fScore;
};

下面是文件操作的代码片段:

C++代码

student s1[2];   // 存放要写入文件的数据
student s2[2];   // 存放从文件读取的数据
CFile file;      // CFile对象
int nReadBytes = 0;   // 从文件中读取到的总字节数   // 为s1数组各元素赋值
s1[0].nNum = 22;
s1[0].fScore = 91.5;
s1[1].nNum = 23;
s1[1].fScore = 85;   // 以创建、读写方式打开文件E:\1.txt
if (file.Open(_T("E:\\1.txt"), CFile::modeCreate | CFile::modeReadWrite))
{   // 写入数据s1结构体数组   file.Write(s1, sizeof(s1));   // 因为上面调用Write以后文件指针在文件尾,所以需要将其移动到文件开头   file.SeekToBegin();   while (true)   {   // 读取数据到s2   int nRet = file.Read((BYTE*)s2 + nReadBytes, sizeof(student));   // 计算已经读取到的总字节数   nReadBytes += nRet;   // 如果读取数据时返回值小于指定的sizeof(student),则说明已到文件尾,跳出循环   if (nRet < sizeof(student))   break;   }   // 关闭文件   file.Close();
}

MFC CFile操作类介绍相关推荐

  1. c语言CFile的使用方法,mfc文件操作CFile类之创建文件的方法

    mfc文件操作类CFile CFile类的几种构造函数 CFile();//不带参数的构造函数. CFile(int hFile);//带文件句柄参数的构造函数. CFile( LPCTSTR lps ...

  2. 【MFC】学习笔记:文件操作类——CFile

    01.目录 目录 01.目录 02.CFile类概述 03.CFile类成员函数 04.两个案例 4.1 实例1 4.2 实例2 05.CFile类总结 02.CFile类概述 如果你学过C语言,应该 ...

  3. [MFC]CFile类实现低级文件I/O

    1. CFile类简介: 1) CFile封装了操作系统对文件读写的相关操作API,是MFC中一种较为低级的I/O操作手段,MFC常用CArchive类对数据进行串行化写入读出磁盘: 2) CFile ...

  4. 【无标题】c++ MFC图像处理CImage类常用操作代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html 我看了一下发现关于c++下的CImage图像处理类 的图像处理相关的介绍 ...

  5. discuz mysql类_Discuz论坛教程之数据库操作DB类和C::t类介绍

    Discuz论坛教程之数据库操作DB类和C::t类介绍 类定义文件 DB类: 文件\source\class\class_core.php [php]view plaincopy classDB ex ...

  6. 使用MFC的CCriticalSection类来实现操作临界区

    使用MFC的CCriticalSection类来实现操作临界区 #include "stdafx.h" #include <windows.h> #include &l ...

  7. mfc mysql操作_MFC的数据库操作

    1. MFC的ODBC类简介 MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发.程序员不必了解ODBC API和SQL的具体细节,利用O ...

  8. VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor

    目录 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor 接上:VC++ 绘制线条 OnLButtonDown函数 ...

  9. VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能

    目录 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能 接上:VC+ ...

最新文章

  1. mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
  2. vue组件级路由钩子函数介绍,及实际应用
  3. 如何查看某oracle实例下面定义了多少jobs
  4. 1.13 总结-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?
  6. sql编写将时间转换年月日 时分格式
  7. jzoj5354-导弹拦截【dp,最大匹配,最少路径覆盖】
  8. mysql把游标数据存入表中_mysql数据库怎么使用游标
  9. python导入random模块_python random模块(随机数)详解
  10. POJ 1195 Mobile phones (二维树状数组)
  11. 新起点、新目标--获得MVP后的感悟
  12. 【java与智能设备】01_2Android简介与环境搭建——开发环境
  13. Office办公软件测试题
  14. 2、通信中的交换技术
  15. k8s pv与pvc
  16. 外包网站建设需要注意什么
  17. 市场调研-全球与中国化妆品级抗坏血酸葡糖苷市场现状及未来发展趋势
  18. 上月和本月对比叫什么_统计学中与上个月比叫什么
  19. 关于研发规范化的一些实践和思考
  20. DSG-01-3C4-A110-51T油研液压直动式电磁阀

热门文章

  1. 恭喜河南建业冲上中超
  2. java批量生成pdf
  3. 如何使用nose 进行Python项目的自动化测试
  4. 三 网络数据分析(1)R语言简单操作
  5. 【散文】 醉月湖畔,为谁染红妆
  6. UI自动化测试是什么?什么项目适合做UI自动化测试
  7. Splay(splay模板)
  8. Simulink三相电机仿真(3)
  9. Hypervisor介绍(二)
  10. java怎样模拟点击网页,笔者操作Java+selenium实现网站模拟点击和页面数据爬取