CFile学习

 CFile类的声明保存在afx.h头文件中。

CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。提供访问本地文件内容的功能,不支持访问网络文件的功能。

CFile 类的成员变量:
m_hFile :表示一个打开文件的操作系统文件句柄。通过对 m_hFile   CFile::hFileNull 的比较来判断该文件是否已经打开。
 
CFile 类的成员函数:
1 、构造函数类
CFile() 在创建一个 CFile 对象时,我们可以采用 3 种方法实现。
A CFile myFile;
   myFile.Open(LPCTSTR lpFileName UINT nOpenFlags CFileException * pError = NULL);
 
B CFile myFile(int hFile);  采用句柄方式创建
    使用该创建方法,在之前需要调用  CreateFile() 函数,该函数的声明如下:
       HANDLE CreateFile(
 LPCTSTR lpFileName,  文件名称
 DWORD   dwDesiredAccess,  文件访问的模式
 DWORD   dwShareMode,      文件的共享模式
 LPSECURITY_ATTTRIBUTE lpSecurityAttribute,  
 DWORD   dwCreationDisposition,    怎么访问
 DWORD   dwFlagsAndAttribute,     文件属性
 HANDLE hTemplateFile,           临时文件句柄
);
   handle = ::CreateFile(
“new.tmp”,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_FLAG_DELETE_ON_CLOSE,NULL
);
 
C CFile(LPCTSTR lpFileName,UINT nOpenFlags);  文件名称,可以是相对路径,绝对路径或者网络路径。
       Throw(CFileException);
 
        关于打开文件所选用的方式介绍:
       CFile::modeCreate  构造新文件,如果文件存在,则长度变为 0
       CFile::modeNoTruncate  该属性和 modeCreate 联合使用,可以达到如下效果:如果文件存在,则不会将文件的长度置为 0 ,如果不存在,则会由 modeCreate 属性来创建一个新文件。
       CFile::modeRead    以只读方式打开文件
       CFile::modeWrite    以写方式打开文件
       CFile::modeReadWrite  以读、写方式打开文件
       CFile::modeNoInherit  阻止文件被子进程继承
       CFile::shareDenyNone  不禁止其它进程读写访问文件,但如果文件已经被其它进程以兼容模式打开,则创建文件失败。
       CFile::shareDenyRead    打开文件,禁止其它进程读此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程读,则 create 失败。
       CFile::shareDenyWrite  打开文件,禁止其它进程写此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程写,则 create 失败。
       CFile::shareExclusive    以独占模式打开文件,禁止其它进程对文件的读写,如果文件已经被其它模式打开读写(即使是当前进程),则构造失败。
       CFile::shareCompat     此模式在 32 MFC 中无效,此模式在使用 CFile::Open 时被映射为 CFile::ShareExclusive
       CFile::typeText         对回车、换行设置特殊进程(仅用于派生类)
       CFile::typeBinary       设置二进制模式(仅用于派生类)
 
virtual void Close();
Throw(CFileException);
关闭文件和对应的 CFile 对象。如果在删除了对象之前没有关闭文件,那么析构函数会为你而关闭文件。如果你时用 new 方式创建的 CFile 对象,那么你必须在删除了 CFile 对象后关闭文件。 Close 函数将设置 m_hFile CFile::hFileNull 。该函数和创建 CFile 对象函数成对使用。
 
virtual void Abort();
该函数和 Close() 函数功能一样,不同的地方有两点: Abort 函数不会抛出异常和错误,将他们忽略;如果这个文件以前没有打开或者关闭则 Abort 就不能 ASSERT
 
virtual CFile* Duplicate() const;
throw(CFileException);
为已建立对象的文件在建立一个 CFile 对象副本。
 
virtual BOOL Open(LPCTSTR lpFileName,UINT nOpenFlags,CFileException* pError = NULL);
        该函数执行成功则返回非 0 值,不成功为 0
 
2 、从文件读入 / 向文件写内容函数
virtual UINT Read(void* lpbuf,UINT nCount);
throw(CFileException);
        该函数返回读到缓冲区的字节长度,注意:对于读入到文件尾部,则返回的字节长度会小于、等于 nCount 的值。该函数表示从当前位置读入 nCount 个字节的内容到 lpbuf 缓冲区。
 
virtual void Write(const void *lpbuf, UINT nCount);
throw(CFileException);
        该函数将缓冲区当前位置以后 cCount 长度的内容,写入到文件从当前位置开始的内容中,替换原来的 nCount 长度的内容。
 
virtual void Flush();
throw(CFileException);
        该函数将强迫保存在文件缓冲区的任何数据写入到文件中。对于 CArchive 则用 CArchive::Flush
 
3 、对文件内容位置进行定位的函数:方便我们只读入部分文件内容或者从某个选定的位置写入设计的内容。该类函数全部用在 open 函数之后。
virtual LONG Seek(LONG lOff , UINT nFrom);
throw(CFileException);
该函数需要定位的位置是合法的, Seek 函数将返回从文件开始位置到需要定位位置的偏移量,否则会抛出 CFileException 异常。
LONG lOff :指的是需要移动的字节数
UINT nFrom :指的是开始查找的初始位置。该值必须是下面 3 个之一: CFile::begin  CFile::current CFileEnd (该值导致 lOff 为负值)
        该函数用在 Read/Write 函数之前。
       Open 一个文件时,初始化的位置在文件开始出,偏移量是 0
 
virtual SeekToBegin();
throw(CFileException);
        该函数将文件指针定位到文件头,等于 Seek(0L,CFiel::begin);
 
DWORD SeekToEnd();
throw(CFileException);
        该函数返回文件的长度,把文件指针设置为文件尾,等于 Seek(0L,CFile::end)
 
virtual DWORD GetLength() const;
throw(CFileException);
        该函数返回文件的长度,
 
virtual void SetLength(DWORD dwNewLen);
throw(CFileException);
        该函数用来设置文件的长度,即可以大于原来的长度,也可以小于原来的长度。如果大于原来的文件长,则会在原文件后面加入空格字符,如果小于原文件则会除去后面多于的字符。
 
4 .锁定文件内容函数
virtual void LockRange(DWORD dwPos,DWORD dwCount);
throw(CFileException);
virtual void UnLockRange(DWORD dwPos,DWORD dwCount);
throw(CFileException);
 
       dwPos :用来标识锁定的起始位置
       dwCount :用来表示锁定的字节数
        锁定内容的目的是为了不让其它的进程反问这段内容,可以对一个文件的多个区域进行锁定,但是锁定的内容区域不能有重合,否则会抛出错误。
 
5 、状态
virtual DWORD GetPosition() const;
throw(CFileException);
        该函数的返回值表示得到该文件的当前指针,目的是为了使用 Seek 函数。用在 Open 函数之后。
 
BOOL GetStatus(CFileStatus& rStatus) const;
Static BOOL PASCAL GetStatus(LPCTSTR lpFileName,CFileStatus &rStatus);
成功获得指定文件的状态信息,返回值是 TURE  0 ,不成功,为 FALSE 0
CFileStatus 结构的包含的域:
              CTime m_ctime :文件创建的日期和时间
              CTime m_mtime :文件最后被修改的日期和时间
              CTime m_atime :文件最后被访问的日期和时间
              LONG m_size :文件的逻辑字节长度
              BYTE m_attribute :文件的属性字节
              char m_szFullName[_MAX_PATH] windows 字符集中的绝对文件名。
 
       m_attribute MFC 提供了枚举类型来表示各种文件属性。
        enum Attribute {
               normal =    0x00,
               readOnly =  0x01,
               hidden =    0x02,
               system =    0x04,
               volume =    0x08,
               directory = 0x10,
               archive =   0x20
        };
       CFile::GetStatus() 是通过 MFC CFile 对象的方式来获得相应打开文件的状态信息。不能向 m_szFullName 结构中插入值。必须 open 文件才能访问
       status  方式即便文件没有正真被 open 一样可以获得 m_szFullName 信息。
 
virtual void SetFilePath(LPCTSTR lpNewName);
该函数是将一个文件名(该文件可以并不存在)和 CFile 对象建立起联系,不是为了 open CFile Create CFile 。用于 open create 一个 CFile 对象之前。
如果要操作该 CFile 对象,如果该文件不存在则需要建立,如果已经建立则需要打开该对象进行操作。
 
virtual CString GetFileName() const;  获得文件名 ”tmp.txt”
virtual CString GetFilePath() const;  获得文件路径名称 ”c:/tmp.txt”
virtual CString GetFileTitle() const;  获得文件名称 ”tmp”
上述 3 个函数只要调用了 SetFilePath 就可以使用,并不需求文件存在或者打开。
static void PASCAL Rename(LPCTSTR lpOldFileName, LPCTSTR lpNewFileName);
throw(CFileException);
该函数将已经存在的文件更名为新的为存在的文件名。不能修改文件夹。该文件关联的 CFile 对象不能被打开。
 
static void PASCAL Remove(LPCTSTR lpFileName);
throw(CFileException);
该函数用来删除一个文件,该文件可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件。同时不能删除文件夹。该文件关联的 CFile 对象不能被打开。
 
static void SetStatus(LPCTSTR lpFileName, const CFileStatus& status);
throw(CFileException);
lpFileName :可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件

猜你喜欢

转载自blog.csdn.net/lasuerte/article/details/78397006