MFC下的文件类CFile.docx

上传人:b****5 文档编号:7452718 上传时间:2023-05-11 格式:DOCX 页数:30 大小:28.14KB
下载 相关 举报
MFC下的文件类CFile.docx_第1页
第1页 / 共30页
MFC下的文件类CFile.docx_第2页
第2页 / 共30页
MFC下的文件类CFile.docx_第3页
第3页 / 共30页
MFC下的文件类CFile.docx_第4页
第4页 / 共30页
MFC下的文件类CFile.docx_第5页
第5页 / 共30页
MFC下的文件类CFile.docx_第6页
第6页 / 共30页
MFC下的文件类CFile.docx_第7页
第7页 / 共30页
MFC下的文件类CFile.docx_第8页
第8页 / 共30页
MFC下的文件类CFile.docx_第9页
第9页 / 共30页
MFC下的文件类CFile.docx_第10页
第10页 / 共30页
MFC下的文件类CFile.docx_第11页
第11页 / 共30页
MFC下的文件类CFile.docx_第12页
第12页 / 共30页
MFC下的文件类CFile.docx_第13页
第13页 / 共30页
MFC下的文件类CFile.docx_第14页
第14页 / 共30页
MFC下的文件类CFile.docx_第15页
第15页 / 共30页
MFC下的文件类CFile.docx_第16页
第16页 / 共30页
MFC下的文件类CFile.docx_第17页
第17页 / 共30页
MFC下的文件类CFile.docx_第18页
第18页 / 共30页
MFC下的文件类CFile.docx_第19页
第19页 / 共30页
MFC下的文件类CFile.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MFC下的文件类CFile.docx

《MFC下的文件类CFile.docx》由会员分享,可在线阅读,更多相关《MFC下的文件类CFile.docx(30页珍藏版)》请在冰点文库上搜索。

MFC下的文件类CFile.docx

MFC下的文件类CFile

MFC下的文件类

11.MFC下的文件类

1.文件操作的方法

使用VisualC++编程,有如下方法进行文件操作:

(1)使用标准C运行库函数,包括fopen、fclose、fseek等。

(2)使用Win16下的文件和目录操作函数,如lopen、lclose、lseek等。

不过,在Win32下,这些函数主要是为了和Win16向后兼容。

(3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。

Win32下,打开和创建文件都由CreateFile完成,成功的话,得到一个Win32下的句柄,这不同于“C”的fopen返回的句柄。

在Win16下,该句柄和C运行库文件操作函数相容。

但在Win32下,“C”的文件操作函数不能使用该句柄,如果需要的话,可以使用函数_open_osfhandle从Win32句柄得到一个“C”文件函数可以使用的文件句柄。

关闭文件使用Win32的CloseHandle。

在Win32下,CreateFile可以操作的对象除了磁盘文件外,还包括设备文件如通讯端口、管道、控制台输入、邮件槽等等。

(4)使用CFile和其派生类进行文件操作。

CFile从CObject派生,其派生类包括操作文本文件的CStdioFile,操作内存文件的CmemFile,等等。

CFile是建立在Win32的文件操作体系的基础上,它封装了部分Win32文件操作函数。

最好是使用CFile类(或派生类)的对象来操作文件,必要的话,可以从这些类派生自己的文件操作类。

统一使用CFile的界面可以得到好的移植性。

2.MFC的文件类

MFC用一些类来封装文件访问的Win32API。

以CFile为基础,从CFile派生出几个类,如CStdioFile,CMemFile,MFC内部使用的CMiororFile,等等。

1.CFile的结构

1.CFile定义的枚举类型

CFile类定义了一些和文件操作相关的枚举类型,主要有四种:

OpenFlags,Attribute,SeekPosition,hFileNull。

下面,分别解释这些枚举类型。

1.OpenFlags

OpenFlags定义了13种文件访问和共享模式:

enumOpenFlags{

//第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写

modeRead=0x0000,

modeWrite=0x0001,

modeReadWrite=0x0002,

shareCompat=0x0000,//32位MFC中没用

//第五到第七位,打开文件时的共享模式

shareExclusive=0x0010,//独占方式,禁止其他进程读写

shareDenyWrite=0x0020,//禁止其他进程写

shareDenyRead=0x0030,//禁止其他进程读

shareDenyNone=0x0040,//允许其他进程写

//第八位,打开文件时的文件继承方式

modeNoInherit=0x0080,//不允许子进程继承

//第十三、十四位,是否创建新文件和创建方式

modeCreate=0x1000,//创建新文件,文件长度0

modeNoTruncate=0x2000,//创建新文件时如文件已存在则打开

//第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用

typeText=0x4000,

typeBinary=(int)0x8000

};

2.Attribute

Attribute定义了文件属性:

正常、只读、隐含、系统文件,文件或者目录等。

enumAttribute{

normal=0x00,

readOnly=0x01,

hidden=0x02,

system=0x04,

volume=0x08,

directory=0x10,

archive=0x20

}

3.SeekPosition

SeekPosition定义了三种文件位置:

头、尾、当前:

enumSeekPosition{

begin=0x0,

current=0x1,

end=0x2

};

4.hFileNull

hFileNull定义了空文件句柄

enum{hFileNull=-1};

1.CFile的其他一些成员变量

CFile除了定义枚举类型,还定义了一些成员变量。

例如:

UINTm_hFile

该成员变量是public访问属性,保存:

:

CreateFile返回的操作系统的文件句柄。

MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。

BOOLm_bCloseOnDelete;

CStringm_strFileName;

这两个成员变量是protected访问属性。

m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。

2.CFile的成员函数

CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:

打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。

其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。

一般地,成员函数被映射到对应的Win32函数,如表11-1所示。

表11-1CFile函数对Win32文件函数的封装

虚拟

静态

成员函数

对应的Win32函数

文件的创建、打开、关闭

 

Abort

CloseHandle

 

Duplicate

DuplicateHandle

 

Open

CreateFile

 

Close

CloseHandle

文件的读写

 

Read

ReadFile

 

 

ReadHuge(向后兼容)

调用Read成员函数

 

Write

WriteFile

 

 

WriteHuage(向后兼容)

调用Write成员函数

 

Flush

FlushFileBuffers

文件定位

 

Seek

SetFilePointer

 

 

SeekToBegin

调用Seek成员函数

 

 

SeekToEnd

调用Seek成员函数

 

GetLength

调用Seek成员函数

 

SetLength

SetEndOfFile

文件的锁定/解锁

 

LockRange

LockFile

 

UnlockRange

UnlockFile

文件状态操作函数

 

GetPosition

SetFilePointer

 

 

GetStatus(CFileStatus&)

GetFileTime,GetFileSize等

 

GetStatus(LPSTRlpszFileNameCFileStatus&)

FindFirstFile

 

GetFileName

不是简单地映射到某个函数

 

GetFileTitle

 

 

GetFilePath

 

 

SetFilePath

 

 

SetStatus

 

改名和删除

 

Rename

MoveFile

 

Remove

DeleteFile

 

1.CFile的部分实现

这里主要讨论CFile对象的构造函数和文件的打开/创建的过程。

1.构造函数

CFile有如下几个构造函数:

∙CFile()

缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。

∙CFile(inthFile)

已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。

HFile将被赋值给CFile的成员变量m_hFile。

∙CFile(LPCTSTRlpszFileName,UINTnOpenFlags)

指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件,把文件句柄保存到m_hFile。

1.打开/创建文件

Open的原型如下:

BOOLCFile:

:

Open(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pException)

Open调用Win32函数:

:

CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。

CreateFile函数的原型如下:

HANDLECreateFile(

LPCTSTRlpFileName,//pointertonameofthefile

DWORDdwDesiredAccess,//access(read-write)mode

DWORDdwShareMode,//sharemode

LPSECURITY_ATTRIBUTESlpSecurityAttributes,//pointertosecuritydescriptor

DWORDdwCreationDistribution,//howtocreate

DWORDdwFlagsAndAttributes,//fileattributes

HANDLEhTemplateFile//handletofilewithattributestocopy

);

显然,Open必须把自己的两个参数lpszFileName和nOpenFlags映射到CreateFile的七个参数上。

从OpenFlags的定义可以看出,(nOpenFlags&3)表示了读写标识,映射成变量dwAccess,可以取值为Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。

(nOpenFlags&0x70)表示了共享模式,映射成变量dwShareMode,可以取值为Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。

Open定义了一个局部的SECURITY_ATTRIBUTES变量sa,(nOpenFlags&0x80)被赋值给sa.bInheritHandle。

(nOpenFlags&modeCreate)表示了创建方式,映射成变量dwCreateFlag,可以取值为Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。

在生成了上述参数之后,先调用:

:

CreateFile:

HANDLEhFile=:

:

CreateFile(lpszFileName,

dwAccess,dwShareMode,&sa,

dwCreateFlag,FILE_ATTRIBUTE_NORMAL,NULL);

然后,hFile被赋值给成员变量m_hFile,m_bCloseOnDelete被设置为TRUE。

由上可以看出,CFile打开(创建)一个文件时大大简化了:

:

CreateFile函数的复杂性,即只需要指定一个文件名、一个打开文件的参数即可。

若该参数指定为0,则表示以只读方式打开一个存在的文件,独占使用,不允许子进程继承。

在CFile对象使用时,如果它是在堆中分配的,则应该销毁它;如果在栈中分配的,则CFile对象将被自动销毁。

销毁时析构函数被调用,析构函数是虚拟函数。

若m_bCloseOnDelete为真且m_hFile非空,则析构函数调用Close关闭文件。

至于其他CFile成员函数的实现,这里不作分析了。

1.CFile的派生类

这里主要简要地介绍CStdioFile和CmemFile及CFileFind。

1.CStdioFile

CStdioFile对文本文件进行操作。

CStdioFile定义了新的成员变量m_pStream,类型是FILE*。

在打开或者创建文件时,使用_open_osfhandle从m_hFile(Win32文件句柄)得到一个“C”的FILE类型的文件指针,然后,在文件操作中,使用“C”的文件操作函数。

例如,读文件使用_fread,而不是:

:

ReadFile,写文件使用了_fwrite,而不是:

:

WriteFile,等等。

m_hFile是CFile的成员变量。

另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是实现了两个新的操作ReadString和WriteString。

2.CMemFile

CMemFile把一块内存当作一个文件来操作,所以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。

相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。

3.CFileFind

为了方便文件查找,MFC把有关功能归结成为一个类CFileFind。

CFileFind派生于CObject类。

首先,它使用FindFile和FineNextFile包装了Win32函数:

:

FindFirstFile和:

:

FindNextFile;其次,它提供了许多函数用来获取文件的状态或者属性。

使用CFileStatus结构来描述文件的属性,其定义如下:

structCFileStatus

{

CTimem_ctime;//文件创建时间

CTimem_mtime;//文件最近一次修改时间

CTimem_atime;//文件最近一次访问时间

LONGm_size;//文件大小

BYTEm_attribute;//文件属性

BYTE_m_padding;//没有实际含义,用来增加一个字节

TCHARm_szFullName[_MAX_PATH];//绝对路径

#ifdef_DEBUG

//实现Dump虚拟函数,输出文件属性

voidDump(CDumpContext&dc)const;

#endif

};

例如:

CFileStatusstatus;

pFile->GetStatus(status);

#ifdef_DEBUG

status.dump(afxDump);

#endif

解读VC++编程中的文件操作API和CFile类

解读VC++编程中的文件操作API和CFile类

2006年03月06日 09:

37天极yesky

   作者:

RisingMine

  在VC编程中,操作文件的方法主要有两种:

利用API函数和MFC的CFile类。

微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。

  1.创建或打开一个文件

  API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。

HANDLECreateFile(

 LPCTSTRlpFileName,//要打开的文件名

 DWORDdwDesiredAccess,//文件的操作属性

 DWORDdwShareMode,//文件共享属性

 LPSECURITY_ATTRIBUTESlpSecurityAttributes,//文件安全特性

 DWORDdwCreationDisposition,//文件操作

 DWORDdwFlagsAndAttributes,//文件属性

 HANDLEhTemplateFile//如果不为零,则指定一个文件句柄。

新文件将从这个文件中复制扩展属性

);

  文件的操作属性:

如果为零,表示只允许获取与一个设备有关的信息,GENERIC_READ表示允许对设备进行读访问;如果为GENERIC_WRITE表示允许对设备进行写访问(可组合使用);

  文件的共享属性:

零表示不共享;FILE_SHARE_READ或FILE_SHARE_WRITE表示允许对文件进行读/写共享访问;

  文件的操作有:

  ·CREATE_NEW:

创建文件;如文件存在则会出错

  ·CREATE_ALWAYS:

创建文件,会改写前一个文件

  ·OPEN_EXISTING:

文件必须已经存在。

由设备提出要求

  ·OPEN_ALWAYS:

如文件不存在则创建它

  ·TRUNCATE_EXISTING:

将现有文件缩短为零长度

  文件属性有:

  ·FILE_ATTRIBUTE_ARCHIVE:

标记归档属性

  ·FILE_ATTRIBUTE_COMPRESSED:

将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式

  ·FILE_ATTRIBUTE_NORMAL:

默认属性

  ·FILE_ATTRIBUTE_HIDDEN:

隐藏文件或目录

  ·FILE_ATTRIBUTE_READONLY:

文件为只读

  ·FILE_ATTRIBUTE_SYSTEM:

文件为系统文件

  ·FILE_FLAG_WRITE_THROUGH:

操作系统不得推迟对文件的写操作

  ·FILE_FLAG_OVERLAPPED:

允许对文件进行重叠操作

  ·FILE_FLAG_NO_BUFFERING:

禁止对文件进行缓冲处理。

文件只能写入磁盘卷的扇区块

  ·FILE_FLAG_RANDOM_ACCESS:

针对随机访问对文件缓冲进行优化

  ·FILE_FLAG_SEQUENTIAL_SCAN:

针对连续访问对文件缓冲进行优化

  ·FILE_FLAG_DELETE_ON_CLOSE:

关闭了上一次打开的句柄后,将文件删除。

特别适合临时文件

  可以组合的属性有:

FILE_FLAG_WRITE_THROUGH,FILE_FLAG_OVERLAPPED,FILE_FLAG_NO_BUFFERING,FILE_FLAG_RANDOM_ACCESS,FILE_FLAG_SEQUENTIAL_SCAN,FILE_FLAG_DELETE_ON_CLOSE,FILE_FLAG_BACKUP_SEMANTICS,FILE_FLAG_POSIX_SEMANTICS,FILE_FLAG_OPEN_REPARSE_POINT,FILE_FLAG_OPEN_NO_RECALL

  如果成功返回一个打开文件得句柄,如果调用函数之前文件存在,文件操作属性为:

CREATE_ALWAYS或OPEN_ALWAYS,使用GetLastError函数返回的是ERROR_ALREADY_EXISTS(包括函数操作成功),如果之前函数不存在,则返回0。

使用失败返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函数。

  文件关闭用:

BOOLCloseHandle(HANDLEhObject//handletoobjecttoclose);

  例子1、在当前目录下面创建一个文件:

HANDLEhandle;

DWORDNum;

handle=:

:

CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);

if(INVALID_HANDLE_VALUE!

=handle)

{

 :

:

SetFilePointer(handle,0,0,FILE_BEGIN);

 charBuffer[]="这是个刚创建的文件";

 :

:

WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL);

 ZeroMemory(Buffer,sizeof(Buffer));

 :

:

SetFilePointer(handle,0,0,FILE_BEGIN);

 :

:

ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL);

 MessageBox(Buffer);

 :

:

CloseHandle(handle);

}

  可以改变上面的创建文件的属性和操作看下不同效果。

  CFile创建和打开一个文件:

  创建文件和打开文件的方法有很多种,下面简单介绍下几个构造函数:

CFile(LPCTSTRlpszFileName,UINTnOpenFlags);

throw(CFileException);

CFile();

BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);

  lpszFileName:

文件名称,可以是相对路径,绝对路径或网络路径

  nOpenFlags:

打开方式有:

  ·CFile:

:

modeCreate调用构造函数构造一个新文件,如果文件已存在,则长度变成0。

  ·CFile:

:

modeNoTruncate此值与modeCreate组合使用。

如果所创建的文件已存在则其长度不变为0。

因而此文件被打开,或者作为一个新文件或者作为一个已存在的文件。

这将是很有用的,例如当打开一个可能存在也可能不存在的文件时。

  ·CFile:

:

modeRead打开文件仅供读。

  ·CFile:

:

modeReadWrite打开文件供读写。

  ·CFile:

:

modeWrite打开文件仅供写。

  ·CFile:

:

modeNoInherit阻止文件被子进程继承。

  ·CFile:

:

ShareDenyNone不禁止其它进程读或写访问,打开文件。

如果文件已被其它进程以兼容模式打开,则Create失败。

  ·CFile:

:

ShareDenyRead打开文件,禁止其它进程读此文件。

如果文件已被其它进程以兼容模式打开,或被其它进程读,则Create失败。

  ·CFile:

:

ShareDenyWrite打开文件,禁止其它进程写此文件。

如果文件已被其它进程以兼容模式打开,或被其它进程写,则Create失败。

  ·CFile:

:

ShareExclusive以独占模式打开文件,禁止其它进程对文件的读写。

如果文件已经以其它模式打开读写(即使被当前进程),则构造失败。

  ·CFile:

:

ShareCompat此标志在32位MFC中无效。

此标志在使用CFile:

:

Open时映射为CFile:

:

ShareExclusive。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2