VC++之使用CFile类打开文件

时间:2022-03-07 20:20:35

VC++之使用CFile类打开文件

一、CFile类
         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对象和路径名联系起来。