MFC读写文件详解
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读写文件详解的更多相关文章
- MFC CFile类读写文件详解
CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 一个读写文件的例子: 文件I/O 虽然使用CArchive类内建的序列化 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- /etc/inittab文件详解
/etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...
- Liunx中fstab文件详解
Liunx中fstab文件详解 /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc ...
- Linux下inittab文件详解
/etc/inittab文件详解 Linux系统的启动过程为:加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动ke ...
- (转)Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
原文:http://blog.51cto.com/freeloda/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Ng ...
- numpy的文件存储.npy .npz 文件详解
Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...
随机推荐
- <noscript> 实例
实例 JavaScript <body> ... ... <script type="text/javascript"> <!‐‐ ...
- Anderson《空气动力学基础》5th读书笔记 第2记——流体静力学初步
与物体在水中受到水的浮力一样,空气中的物体也会受到空气的浮力,但由于这个浮力往往比较小,实际中的很多问题我们常常将它忽略,而对于像热气球这样的靠空气的浮力产生升力的飞行器来说,空气的浮力是不能忽略的. ...
- 大白话聊OSI七层模型和TCP/IP四层模型
前言 今天和大家聊的是一个比较基础的问题,OSI七层模型和TCP/IP四层模型. 小伙伴们可能有疑问,这个东西还用写文章吗,太基础了吧,网上文章多的是,随便一搜索就能找到. 确实是这样,网上资料确实很 ...
- Nacos快速入门
什么是 Nacos Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供 ...
- bootstrapvalidator常用验证解析和使用
学这个博主的:https://www.cnblogs.com/wang-kai-xuan/p/11031733.html BootStrapValidator表单验证插件的学习和使用 引入标签 ...
- springboot错误统一处理
1,对于404,500这类错误,可以直接新建public/error目录 ,在error目录 中新建404.html, 500.html或5xx.html,springboot会自动跳转到这些静态页面 ...
- DataSkew 数据倾斜
date: 2020-04-21 19:38:00 updated: 2020-04-24 10:26:00 DataSkew 数据倾斜 1. Hive 里的数据倾斜 1.1 null值 空值 尽量提 ...
- 教你如何使用github+jsDelivr搭建免费图床
前言 之前写了一篇文章,教你如何使用Typora+PicGo实现图片自动上传到图床 . 这里我用的是七牛图床,七牛图床有一定的免费使用量(没记错的话应该是10个G),如果你的存储量超过这个大小就需要付 ...
- 优雅手撕bind函数(面试官常问)
优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...
- Oracle终极彻底卸载
停止使用Oracle的服务 停用oracle服务,进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止. 运行卸载Oracle数据库程序 一般情况运行Oracle自带的卸载程序,如使 ...