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:可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值