使用CFile类进行文件操作
为了方便对文件进行操作,MFC类库提供了一个CFile类,该类封装了对文件的各种操作。使用CFile类,用户可以非常容易地对文件进行操作。CFile类的主要方法如下:
(1)Open方法
该方法用于打开一个文件。
语法:
virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFIleException* pError = NULL );
参数说明:
lpszFileName:表示要打开的文件名。可以包含完整路径,也可以是相对的文件名。
nOpenFlags:表示文件打开标记,其可选值如表1所示。
表1 CFile打开标记
|
值
|
描述
|
|
CFile::modeCreate
|
创建一个新文件,如果文件已经存在,则删除文件中的数据
|
|
CFile::modeNoTruncate
|
该标记与CFile::modeCreate组合使用,如果文件已存在,不删除文件现有数据
|
|
CFile::modeRead
|
以只读的形式打开文件
|
|
CFile::modeReadWrite
|
以读写的方式打开文件
|
|
CFile::modeWrite
|
以只写的形式打开文件
|
|
CFile::modeNoInherit
|
阻止文件句柄被子进程继承
|
|
CFile::shareDenyNone
|
以不阻止其他进程读写文件的形式打开文件
|
|
CFile::shareDenyRead
|
以阻止其他进程读取文件的形式打开文件
|
|
CFile::shareDenyWrite
|
以阻止其他进程写入文件的形式打开文件
|
|
CFile::shareExclusive
|
以独占的形式打开文件,阻止其他进程对文件进行操作
|
|
CFile::shareCompat
|
在32位MFC中无效。此标志在使用CFile::Open时映射为CFile::ShareExclusive
|
|
CFile::typeText
|
设置文本模式,对回车换行符进行特殊处理
|
|
CFile::typeBinary
|
设置二进制模式
|
|
|
|
注意: CFile::modeRead和CFile::modeWrite分别以只读和只写权限访问文件。这两个标记不能同时存在,如果写成CFile::modeRead|CFile::modeWrite的形式,表示以只写形式访问文件,也就是说这种形式与CFile::modeWrite的作用是相同的。
pError:一个异常的指针,一般情况下可以使用NULL指针,这个指针在打开文件过程中如果产生错误,Open将抛出一个CFileException异常,而不是返回FALSE。
(2)Close
该方法用于关闭打开的文件。
语法:
virtual void Close( );
(3)Read
该方法用于从文件中读取数据到缓冲区中。
语法:
virtual UINT Read( void* lpBuf, UINT nCount );
参数说明:
lpBuf:表示接收数据的缓冲区。
nCount:表示从文件中读取数据的最大数量。
返回值:函数返回实际读取的字节数。
(4)ReadHuge
该方法从文件中读取数据到缓冲区,主要用于大文件的读取。
语法:
DWORD ReadHuge( void* lpBuffer, DWORD dwCount );
参数说明:
lpBuffer:表示接收数据的缓冲区。
nCount:表示从文件中读取数据的最大数量。
返回值:函数返回实际读取的字节数。
(5)Write
该方法用于从缓冲区中写入数据到文件中。
语法:
virtual void Write( const void* lpBuf, UINT nCount );
参数说明:
lpBuf:表示待写入数据的缓冲区。
nCount:表示向文件中写入数据的数量。
(6)WriteHuge
该方法用于从缓冲区中写入数据到文件中,主要用于较大数据量数据的写入。
语法:
void WriteHuge( const void* lpBuf, DWORD dwCount );
参数说明:
lpBuf:表示待写入数据的缓冲区。
nCount:表示向文件中写入数据的数量。
(7)Flush
该方法将文件缓冲区中的数据强制写入文件中。
语法:
virtual void Flush( );
(8)Seek
该方法用于重新设置文件指针的位置。
语法:
virtual void LockRange( DWORD dwPos, DWORD dwCount );
参数说明:
lOff:表示文件指针移动的字节数。
nFrom:指针移动的起点。为CFile::begin,表示从文件开始,把指针向后移动lOff字节。为CFile::current,表示从当前位置开始,把指针向后移动lOff字节。为CFile::end,表示从文件尾开始,把指针向前移动lOff字节。
(9)LockRange
该方法用于锁定文件中指定区域中的数据,这样可以阻止其他进程对该区域数据的访问。
语法:
virtual void LockRange( DWORD dwPos, DWORD dwCount );
参数说明:
dwPos:表示从开始字节到被封锁的字节的偏移量
dwCount:表示封锁的字节数
(10)UnlockRange
该方法用于解锁文件中指定区域中的数据,以允许其他进程对该区域数据的访问。
语法:
virtual void UnlockRange(ULONGLONG dwPos,ULONGLONG dwCount );
参数说明:
dwPos:表示从开始字节到被解锁的字节的偏移量
dwCount:表示解锁的字节数
(11)Rename
该方法用于对文件进行重命名。
语法:
static void PASCAL Rename( LPCTSTR lpszOldName, LPCTSTR lpszNewName );
参数说明:
lpszOldName:表示原文件名。
lpszNewName:表示新文件名。
(12)GetStatus
该方法用于获取文件的状态。
语法:
BOOL GetStatus( CFileStatus& rStatus ) const;
参数说明:
rStatus:文件状态对象,其类型是CFileStatus,CFileStatus是一个存储状态信息的数据结构,CFileStatus的结构成员如表2所示。
表2 文件状态
|
类型
|
成员
|
描述
|
|
CTime
|
m_ctime
|
文件的创建时间
|
|
CTime
|
m_mtime
|
文件的修改时间
|
|
CTime
|
m_atime
|
文件的最后访问时间
|
|
LONG
|
m_size
|
文件的逻辑大小
|
|
BYTE
|
m_attribute
|
文件的系统属性
|
|
char
|
m_szFullName[_MAX_PATH]
|
文件的绝对路径
|
(13)SetStatus
该方法用于设置文件的状态。
语法:
static void SetStatus( LPCTSTR lpszFileName, const CFileStatus& status );
参数说明:
lpszFileName:表示文件的名称,可以是绝对的也可以是相对的,但不能是网络路径。
status:是CFileStatus结构指针,表示设置的文件状态。
(14)GetLength
该方法用于获取文件的长度。
语法:
virtual ULONGLONG GetLength( ) const;
下面通过一个示例来介绍如何使用CFile类进行文件操作。
例如,使用CFile类进行文件操作
(1)创建一个基于对话框的工程,工程名称为“OperateFile”。
(2)处理“写入”按钮的单击事件,向文件中写入数据。
void COperateFileDlg::OnWrite()
{
CFile file; //定义一个文件对象
file.Open("demo.txt",CFile::modeCreate|CFile::modeReadWrite); //创建文件
file.Write("复兴之路,大国崛起",18); //向文件中写入数据
file.Close(); //关闭文件
}
(3)处理“读取”按钮的单击事件,读取文件的内容和属性信息。
void COperateFileDlg::OnRead()
{
CFile file; //定义文件对象
file.Open("demo.txt",CFile::modeRead); //以读的方式打开文件
unsigned char pchData[MAX_PATH] = {0}; //定义数据缓冲区
file.Read(pchData,MAX_PATH); //读取数据到缓冲区
CFileStatus flStatus; //定义文件状态
file.GetStatus(flStatus); //获取文件状态
file.Close(); //关闭文件
//获取文件创建时间
CString createtime = flStatus.m_ctime.Format("%Y-%m-%d %H:%M:%S");
CString hint = "文件内容:"; //定义一个字符串
hint += (char*)pchData; //添加字符串
hint +="n"; //添加换行符
hint +="创建时间: "; //添加数据
hint +=createtime; //添加数据
MessageBox(hint,"提示"); //弹出提示对话框
}
(4)运行程序,效果如图1所示。
.jpg)
图1 CFile类操作文件