MFC下的文件类CFileWord格式.docx

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

MFC下的文件类CFileWord格式.docx

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

MFC下的文件类CFileWord格式.docx

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

文件的读写

Read

ReadFile

ReadHuge(向后兼容)

调用Read成员函数

Write

WriteFile

WriteHuage(向后兼容)

调用Write成员函数

Flush

FlushFileBuffers

文件定位

Seek

SetFilePointer

SeekToBegin

调用Seek成员函数

SeekToEnd

GetLength

SetLength

SetEndOfFile

文件的锁定/解锁

LockRange

LockFile

UnlockRange

UnlockFile

文件状态操作函数

GetPosition

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。

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);

status.dump(afxDump);

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

2006年03月06日 

09:

37天极yesky

 

作者:

RisingMine

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

利用API函数和MFC的CFile类。

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

  1.创建或打开一个文件

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

 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));

ReadFile(handle,Buffer,sizeof(Buffer),&

 MessageBox(Buffer);

CloseHandle(handle);

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

  CFile创建和打开一个文件:

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

CFile(LPCTSTRlpszFileName,UINTnOpenFlags);

throw(CFileException);

CFile();

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

  lpszFileName:

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

  nOpenFlags:

打开方式有:

CFile:

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

modeNoTruncate此值与modeCreate组合使用。

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

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

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

modeRead打开文件仅供读。

modeReadWrite打开文件供读写。

modeWrite打开文件仅供写。

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

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

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

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

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

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

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

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

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

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

此标志在使用CFile:

Open时映射为CFile:

ShareExclusive。

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

当前位置:首页 > 幼儿教育 > 唐诗宋词

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

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