1.CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。

  虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便捷方式,但有时在程序中需要对文件处理过程拥有更多的控制权,对于这种文件输入输出(I/O)服务

的需求,Windows提供了一系列相关的API函数,并由MFC将其封装为CFile类,提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功

能,足以处理任意类型的文件操作。CFile类是MFC文件类的基类,支持无缓冲的二进制输入输出,也可以通过与CArchive类的配合使用而支持对MFC对象的带缓冲的序列化。

  CFile类包含有一个公有型数据成员m_hFile,该数据成员包含了同CFile类对象相关联的文件句柄。如果没有指定句柄,则该值为CFile::hFileNull。由于该数据成员所包含的

意义取决于派生的类,因此一般并不建议使用m_hFile。

  通过CFile类来打开文件可以采取两种方式:一种方式是先构造一个CFile类对象然后再调用成员函数Open()打开文件,另一种方式则直接使用CFile类的构造函数去打开

一个文件。下面的语句分别演示了用这两种方法打开磁盘文件“C:/1.txt”的过程:

CFile file;

file.open("C://1.txt",CFile::modeReadWrite);

其中参数CFile::modeReadWrite是打开文件的模式标志,CFile类中与之类似的标志还有十几个,现集中列表如下:

  文件模式标志 说明

  CFile::modeCreate  创建方式打开文件,如文件已存在则将其长度设置为0

  CFile::modeNoInherit  不允许继承

  CFile::modeNoTruncate 创建文件时如文件已存在不对其进行截断

  CFile::modeRead 只读方式打开文件

  CFile::modeReadWrite 读写方式打开文件

  CFile::modeWrite 写入方式打开文件

  CFile::shareCompat 在使用过程中允许其他进程同时打开文件

  CFile::shareDenyNone 在使用过程中允许其他进程对文件进行读写

  CFile::shareDenyRead 在使用过程中不允许其他进程对文件进行读取

  CFile::shareDenyWrite 在使用过程中不允许其他进程对文件进行写入

  CFile::shareExclusive  取消对其他进程的所有访问

  CFile::typeBinary 设置文件为二进制模式

  CFile::typeText 设置文件为文本模式

  这些标志可以通过“或”运算符而同时使用多个,并以此来满足多种需求。例如,需要以读写方式打开文件,如果文件不存在就创建一个新的,如果文件已经存在则不将其文

件长度截断为0。为满足此条件,可用CFile::modeCreate、CFile::modeReadWrite和CFile::modeNoTruncate等几种文件模式标志来打开文件:

CFile file("C://1.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);

在打开的文件不再使用时需要将其关闭,即可以用成员函数Close()关闭也可以通过CFile类的析构函数来完成。当采取后一种方式时,如果文件还没有被关闭,析构函数将负

责隐式调用Close()函数去关闭文件,这也表明创建在堆上的CFile类对象在超出范围后将自动被关闭。由于调用了对象的析构函数,因此在文件被关闭的同时CFile对象也被销

毁,而采取Close()方式关闭文件后,CFile对象仍然存在。所以,在显式调用Close()函数关闭一个文件后可以继续用同一个CFile对象去打开其他的文件。

文件读写是最常用的文件操作方式,主要由CFile类成员函数Read()、Write()来实现。其函数原型分别为:

UINT Read(void *lpBUF,UINT nCount);

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

参数lpBuf为指向存放数据的缓存的指针,nCount为要读入或写入的字节数,Read()返回的为实际读取的字节数,该数值小于或等于nCount,如果小于nCount则说明已经读

到文件末尾,可以结束文件读取,如继续读取,将返回0。因此通常可以将实际读取字节数是否小于指定读取的字节数或是否为0作为判断文件读取是否到达结尾的依据。下面这

段代码演示了对文件进行一次性写入和循环多次读取的处理过程:

CFile file;

file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);

memset(WriteBuf, 'a', sizeof(WriteBuf));

file.Write(WriteBuf, sizeof(WriteBuf));

file.Close();

file.Open("C://TestFile.txt", CFile::modeRead);

while (true)

{

  int ret = file.Read(ReadBuf, 100);

  if (ret < 100)

  break;

}

file.Close();

Write()和Read()函数执行完后将自动移动文件指针,因此不必再显示调用Seek()函数去定位文件指针。包含有文件定位函数的完整代码如下所示:

CFile file;

file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);

memset(WriteBuf, 'a', sizeof(WriteBuf));

file.SeekToBegin();

file.Write(WriteBuf, sizeof(WriteBuf));

file.Close();

file.Open("C://TestFile.txt", CFile::modeRead);

while (true)

{

  static int position = 0;

  file.Seek(position, CFile::begin);

  int ret = file.Read(ReadBuf, 100);

  position += ret;

   if (ret < 100)

  break;

}

file.Close();

2.有了读写文件的功能实际操作起来就简单起来,相当于数据库使用。

3.CFileFind类的使用

  3.1开始查找(指定查找的目录)

    CFileFind::FindFile(strFileName,0);  //strName为要查找的文件名,为NULL表示查找“*.*”成功返回非0,失败返回0

  3.2查找下一个(获取当前文件信息,返回下一个文件是否存在)

    CFileFind::FindNextFile();  //返回非0表示还有符合条件的下一个文件,返回0表示已是最后一个文件

  3.3获取/判断文件信息

    CFileFind::GetCreationTime();  //获取文件的创建时间,成功返回非0,失败返回0

      virtual BOOL GetCreationTime(FILETIME *pFileTime) const;  //FILETIME  *:容纳时间的结构指针

      virtual BOOL GetCreationTime(CTime& refTime) const;  //CTime&:容纳时间的对象地址

      FILETIME和CTime的相互转换:

        FILETIME转CTime:

          1、CTime对象在初始化时可以传递FILETIME结构

            FILETIME ft;

            CTime time(ft);

          2、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构

            FILETIME ft;

            SYSTEMTIME st;

            BOOL bSuccess=::FileTimeToSystemTime(&ft , &st);

            CTime time(st);

        CTime转FILETIME:

          CTime time(CTime::GetCurrentTime());

          SYSTEMTIME st;

          time.GetAsSystemTime(st);

          FILETIME ft;

          ::SystemTimeToFileTime(&st,&ft);

    CFileFind::GetLastAccessTime();  //获取文件最后被访问的时间,成功返回非0,失败返回0

      virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;

      virtual BOOL GetLastAccessTime(CTime& refTime) const;

    CFileFind::GetLastWriteTime();  //获取文件最后被修改的时间,成功返回非0,失败返回0

      virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;

      virtual BOOL GetLastWriteTime(CTime& refTime) const;

    CFileFind::GetRoot();  //获取查找到的文件的根目录,必须在执行FindNextFile()后执行该函数,返回CString对象

    CFileFind::GetFileName();  //获取查找到的文件的全名(包含扩展名),必须在执行FindNextFile()后执行该函数,返回CString对象

    CFileFind::GetFilePath();  //获取查找到的文件的绝对路径,必须在执行FindNextFile()后执行该函数,返回CString对象

    CFileFind::GetFileTitle();  //获取查找到的文件的名称(若系统默认隐藏文件扩展名则不显示),必须在执行FindNextFile()后执行该函数,返回CString对象

    CFileFind::GetFileURL();  //获取查找到的文件的URL路径,必须在执行FindNextFile()后执行该函数,返回CString对象

    CFileFind::GetLength();  //获取查找到的文件的长度DWORD

    CFileFind::IsArchived();  //判断查找的文件属性是否是档案文件,必须在执行FindNextFile()后执行该函数,非0表示是,0表示不是

    CFileFind::IsCompressed();  //判断查找的文件属性是否是压缩文件,必须在执行FindNextFile()后执行该函数

    CFileFind::IsDirectory();  //判断查找的文件属性是否为路径文件(文件夹),必须在执行FindNextFile()后执行该函数

    CFileFind::IsDots();  //判断查找的文件属性是否是“.”、“..”,必须在执行FindNextFile()后执行该函数

    CFileFind::IsHidden();  //判断查找的文件属性是否为隐藏文件,必须在执行FindNextFile()后执行该函数

    CFileFind::IsNormal();  //判断查找的文件属性是否为正常文件,必须在执行FindNextFile()后执行该函数

    CFileFind::IsReadOnly();  //判断查找的文件属性是否为只读文件,必须在执行FindNextFile()后执行该函数

    CFileFind::IsSystem();  //判断查找的文件属性是否为系统文件,必须在执行FindNextFile()后执行该函数

    CFileFind::IsTemporary();  //判断查找的文件属性是否为临时文件,必须在执行FindNextFile()后执行该函数

    CFileFind::MatchesMask(DWORD dwMask);  //判断查找的文件的综合属性,必须在执行FindNextFile()后执行该函数

      dwMask参数包括:

        FILE_ATTRIBUTE_ARCHIVE:档案文件

        FILE_ATTRIBUTE_COMPRESSED:压缩文件

        FILE_ATTRIBUTE_DIRECTORY:路径文件

        FILE_ATTRIBUTE_NORMAL:正常文件

        FILE_ATTRIBUTE_READONLY:只读文件

        FILE_ATTRIBUTE_SYSTEM:系统文件

        FILE_ATTRIBUTE_TEMPORARY:临时文件

        FILE_ATTRIBUTE_HIDDEN:隐藏文件

  3.4结束查找

    CFileFind::Close();

4.结束疲倦的一天,明天继续美好的生活。

                                  改变自己,从现在做起-----------久馆

MFC读写文件详解的更多相关文章

  1. MFC CFile类读写文件详解

    CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 一个读写文件的例子: 文件I/O 虽然使用CArchive类内建的序列化 ...

  2. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  3. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  4. [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  5. /etc/inittab文件详解

    /etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...

  6. Liunx中fstab文件详解

    Liunx中fstab文件详解 /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc ...

  7. Linux下inittab文件详解

    /etc/inittab文件详解 Linux系统的启动过程为:加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动ke ...

  8. (转)Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    原文:http://blog.51cto.com/freeloda/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Ng ...

  9. numpy的文件存储.npy .npz 文件详解

    Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...

随机推荐

  1. 【Azure 环境】连接到微软云Azure中国区 By VS 2019, VS Code, Powershell

    问题情形 最近,在使用最新的VS Code插件连接到中国区的Azure时候,出现了依旧是global版的登录连接.这个问题是当前Azure Account插件最新版的问题,可以使用V0.8.11版本登 ...

  2. Rust借用机制的理解分析

    Rust初学者大多会遇到这样的问题: 为什么同一资源不可被同时可变借用和不可变借用? 为什么Rc一定只能是只读的,一定要配合std::cell系列(Cell,RefCell,UnsafeCell)才能 ...

  3. 【Azure微服务 Service Fabric 】因证书过期导致Service Fabric集群挂掉(升级无法完成,节点不可用)

    问题描述 创建Service Fabric时,证书在整个集群中是非常重要的部分,有着用户身份验证,节点之间通信,SF升级时的身份及授权认证等功能.如果证书过期则会导致节点受到影响集群无法正常工作. 当 ...

  4. Zeal(文档)安装使用

    Zeal是一个为软件开发者提供的离线文档浏览器. 一.下载安装 下载地址:https://zealdocs.org/ 二.安装后下载自己需要的文档 1.通过Zeal原生源直接下载文档 Tools -& ...

  5. 【问题记录】—.NetCore 编译问题

    最近在协助验证Jenkins自动编译发布时,对一些.Net Core编译问题进行了解决:特记录一下 一.编译生成netcoreapp目录问题 问题现象 .net core项目编译输出目录总是包含在[n ...

  6. JQuery如何实现统计图表

    EEP JQuery如何实现统计图表 讯光科技 前言 在ERP项目开发过程中,统计图表(chart)普遍应用于各种统计和报表中,其形象直观,内容清晰.EEP的JQuery网站项目使用了Easyui 插 ...

  7. Vulnhub DC3

    靶机简介 C-3是另一个专门建造的易受攻击的实验室,目的是获得渗透测试领域的经验.与以前的DC版本一样,这个版本是为初学者设计的,尽管这次只有一个标志,一个入口点,根本没有线索.Linux技能和熟悉L ...

  8. Go语言的互斥锁Mutex

    目录 一.使用方法 二.死锁场景 1.Lock/Unlock不是成对出现 2.锁被拷贝使用 3.循环等待 一.使用方法 Mutext是互斥锁的意思,也叫排他锁,同一时刻一段代码只能被一个线程运行,两个 ...

  9. Python使用协程进行爬虫

    详情点我跳转 关注公众号"轻松学编程"了解更多. 1.协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 ?? 首先我们得知道协程是啥?协程其实可以认为是比线程更小 ...

  10. LWJGL3的内存管理,简介及目录

    LWJGL3的内存管理,简介及目录 LWJGL3 (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java ...