1.1、CFile类,一个提供二进制文件操作接口的类,是MFC文件操作类之基础。 1.2、用CFile类打开文件
1.2.1、定义CFile对象,后调用open()函数打开文件
CFile m_file; //定义Cfile对象
m_file.open( //打开文件
LPCTSTR lpszFileName, //文件路径和文件名
UINT nOpenFlages); //打开文件的参数
1.2.2、无参数构造函数
Cfile(); //不打开文件,将m_hFile设置为CFile::hFileNull
1.2.3、用一个参数的构造函数打开文件
CFile( //对访问模式或文件类型不作检查;CFile对象被析构时,操作系统文件不会关闭,须手工关闭
HANDLE hFile ); //已打开的文件句柄
1.2.4、用二个参数的构造函数打开文件
CFile( //构造一个CFile对象,打开给定路径相对应的操作系统文件。CFile()与Open函数组合,打开文件出错为不可解决错误
LPCTSTR lpszFileName, //需打开的文件路径名,路径可为相对的也可为绝对的路径
UINT nOpenFlages); //共享和访问模式,指定当打开文件时进行的动作,可以将打开文件的参数用OR(|)操作符联起来
使用例:
char* pFileName = "test.dat";
TRY
{
CFile f(pFileName, CFile::modeCreate | CFile::modeWrite);
}
CATCH(CFileException,e)
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e->m_cause<<"\n";
#endif
}
END_CATCH
1.3、CFile类打开文件的参数
nOpenFlages
值 说明
CFile::modeCreate
创建新文件。文件存在则清空已存在文件
CFile::modeNoTruncate
与创建新文件参数合用,使文件存在时,不清空文件
CFile::modeRead
只读方式打开文件
CFile::modewrite
只写方式打开文件
CFile::modeReadWrite
以读写方式打开文件
CFile::modeNoInherit
防止子进程继承打开的文件
CFile::sharaDenyNone
共享打开文件。文件被其他进程以兼容模式打开,则创建失败。
CFile::sharaDenyRead
不共享打开文件。文件被其他进程以兼容模式打开,则创建失败。
CFile::sharaDenyWrite
不共享打开文件。文件被其他进程以兼容模式打开,则创建失败。
CFile::sharaExclusive
不共享,独占方式打开文件。
CFile::typeText
文本模式打开文件,对回车换行设置特殊处理(只用于CFile的派生类)。
CFile::typeText
二进制模式打开文件,只用于CFile的派生类。
二、CFile类的成员
2.1、数据成员
2.1.1、声明
CFile::m_hFile //该成员依赖派生类,不推荐使用;m_hFile一般作一个公共成员支持类的非复式使用
2.1.2、功能
包含一个打开文件的操作系统文件句柄。如句柄未被分配,m_hFile包含CFile::hFileNull(与操作系统无关的空文件标识符)
2.2、构造函数
2.2.1、CFile
2.2.1.1、声明
CFile();
CFile(int hFile);
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
2.2.1.2、功能
从一个路径或文件句柄构造一个CFile对象
2.2.2、Abort
2.2.2.1、声明
virtual void Abort( );
2.2.2.2、功能
无条件关闭一个文件
2.2.2.3、例
CStdioFile fileTest;
Char* pFileName = "test.dat";
TRY
{
fileTest.Open(pFileName,CFile::modewrite);
}
CATCH_ALL(e)
{
fileTest.Abort( ); // close File safely and quietly
THROW_LAST ( );
}
END_CATCH_ALL
2.2.3、Duplicate
2.2.3.1、声明
virtual CFile* Duplicate( ) const;
throw(CFileException);
2.2.3.2、功能
为给定文件构造一个备份CFile对象,返回一个备份CFile对象,等价于C运行函数_dup
2.2.4、Close
2.2.5.1、声明
virtual void Close( );
throw(CFileException);
2.2.5.2、功能
关闭文件,删除对象
2.2.5、Open
2.2.4.1、声明
virtual BOOL Open(LPCTSTR lpszFileName, //待打开文件的路径,可为绝对、相对或网络名(UNC)。
UINT nOpenFlags, //一个定义文件共享、访问模式的UINT,类似CFile构造函数。
CFileException* pError = NULL); //一个存在的文件异常对象,获取失败操作的状态。
2.2.4.2、功能
带错误检验选项,安全打开一个文件。打开成功返回非零值,否则为0。
Open使用结果:
pError 是否遇到错误? 返回值 CFileException内容
NULL 没有 TRUE n/a
ptr指向CFileException 没有 TRUE 不变
NULL 遇到 FALSE n/a
ptr指向CFileException 遇到 FALSE 被初始化,用于描述错误
2.2.4.3、例
CFile f;
CFileException e;
char* pFileName = "test.dat";
if(!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite,&e))
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e.m_cause<<"\n";
#endif}
2.3、输入/输出
2.3.1、Read
2.3.1.1、声明
virtual UINT Read (void* lpBuf, //指向用户提供的缓冲区,从文件中读取的数据送该缓冲区
UINT nCount); //从文件中读出的字节数的最大值。文本模式文件,回车换为一个字符
throw(CFileException);
2.3.1.2、功能
从与CFile对象相关联的文件读数据到缓冲区
2.3.1.3、例
extern CFile cfile; //声明cfile为外部文件对象
char pbuf[100]; //声明数组pbuf
UINT nBytesRead = cfile.Read(pbuf,100); //将文件内读出数据送pbuf数组。
2.3.2、Write
2.3.2.1、声明
virtual void Write(const void* lpBuf, //指向用户提供的缓冲区,包含将写入文件中的数据
UINT nCount); //从缓冲区内传输的字节数。文本模式文件,回车换行作为一个字符
throw (CFileException);
2.3.2.2、功能
将数据从缓冲区写入与CFile对象相关联的文件
2.3.2.3、例
extern CFile cfile;
char pbuf[100];
cfile.Write(pbuf,100);
2.3.3、WriteHuge
2.3.3.1、声明
void WriteHuge(const void* lpBuf,DWORD dwCount);
throw(CFileExcePtion);
2.3.3.2、功能
将文件大于64K数据写到当前文件位置,在32位编程中废弃了
2.3.4、Flush
2.3.4.1、声明
virtual void Flush( )
throw( CFileException );
2.3.4.2、功能 强制将滞留在缓冲区的数据写入文件
2.4、定位
2.4.1、Seek
2.4.1.1、声明
virtual LONG Seek(LONG lOff, //指针移动字节数
UINT nFrom); //指针移动模式,可为CFile::begin(从文件开始,指针后移lOff字节);
//CFile::current(从当前位置开始,指针后移lOff字节);CFile::end(从文件为开始,指针前移lOff字节)
throw(CFileException);
2.4.1.2、功能
在打开文件中重新定位一个指针。文件打开时,文件指针为偏移量0处
2.4.1.3、例
extern CFile cfile;
LONG lOffset = 1000;
LONG lActual = cfile.Seek(lOffset, CFile::begin);
2.4.2、SeekToBegin
2.4.2.1、声明
void SeekToBegin( );
throw(CFileException);
2.4.2.2、功能
将文件指针指向文件开始处,等价于Seek(0L, CFile::begin)。
2.4.2.3、例
extern CFile cfile;
cfile.SeekToBegin( );
2.4.3、SeekToEnd
2.4.3.1、声明
DWORD SeekToEnd( );
throw(CFileException);
2.4.3.2、功能
将文件指针指向文件逻辑尾部,等价于CFile::Seek( 0L, CFile::End);
2.4.3.3、例
extern CFile cfile;
DWORD dwActual = cfile.SeekToEnd( );
2.4.4、GetLength
2.4.4.1、声明
virtual DWORD GetLength( ) const;
throw( CFileException );
2.4.4.2、功能
获取文件当前逻辑长度,以字节表示
2.4.5、SetLength
2.4.5.1、声明
virtual void SetLength(DWORD dwNewLen); //以字节指定文件长度,可比当前文件大或小,文件即按需要被扩展或截取
throw(CFileException);
2.4.5.1、功能
改变文件长度。和CMemFile一起使用,可能产生一个CMemeryException对象
2.4.5.1、例
extern CFile cfile;
DWORD dwNewLength = 10000;cfile.SetLength(dwNewLength);
2.5、状态
2.5.1、GetPosition
2.5.1.1、声明
virtual DWORD GetPosition ( )const;
throw (CFileException);
2.5.1.2、功能
获取当前文件指针,可为Seek调用
2.5.1.3、例
extern CFile cfile;
DWORD dwPosition = cfile.GetPosition( );
2.5.2、GetStatus
2.5.2.1、声明
BOOL GetStatus(CFileStatus& rStatus)const;
static BOOL PASCAL GetStatus(LPCSTR lpszFileName, //Windows字符集表示的文件路径,不包含网络名的绝对或为相对文件路径。
CFileStatus& rStatus); //用户提供的CFileStatus结构参考,用来接收状态信息。
2.5.2.2、功能
其虚拟版本获取与CFile对象有关的文件的状态,不把值插入到m_szFullName结构成员中。
其静态版本获取文件状态并把文件名拷入m_szFullName
2.5.2.3、例
CFileStatus status;
Extern CFile cfile;
If(cfile.GetStatus(status)) // virtual member function
{
#ifdef _DEBUG
afxDump<<"File size ="<<status.m_size<<"\n";
#endif
}
char* pFileName ="test.dat";
if(CFile::GetStatus(pFileName,status)) // status function
{
#ifdef _DEBUG
afxDump<<"Full File name ="<<status.m_szFullName <<"\n";
#endif
}
2.5.3、GetFileName
2.5.3.1、声明
virtual CString GetFileName( )const;
2.5.3.2、功能
获取指定文件的文件名
2.5.4、GetFileTitle
2.5.4.1、声明
virtual CString GetFileTitle( )const;
2.5.4.2、功能
获取指定文件的标题
2.5.5、GetFilePath
2.5.5.1、声明
virtual CString GetFilePath( )const;
2.5.5.2、功能
获取指定文件的完整路径
2.5.6、SetFilePath
2.5.6.1、声明
virtual void SetFilePath(LPCTSTR lpszNewName);
2.5.6.2、功能
设置指定文件的完整路径,即将CFile对象和路径名联系起来。