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:可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件。
http://blog.csdn.net/dodream/article/details/1687948