MFC下的文件类CFileWord文档格式.docx
- 文档编号:18316659
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:30
- 大小:28.14KB
MFC下的文件类CFileWord文档格式.docx
《MFC下的文件类CFileWord文档格式.docx》由会员分享,可在线阅读,更多相关《MFC下的文件类CFileWord文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
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。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 文件 CFile