Windows CE嵌入式高级编程及其实例详解6.docx
- 文档编号:10467004
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:92
- 大小:151.55KB
Windows CE嵌入式高级编程及其实例详解6.docx
《Windows CE嵌入式高级编程及其实例详解6.docx》由会员分享,可在线阅读,更多相关《Windows CE嵌入式高级编程及其实例详解6.docx(92页珍藏版)》请在冰点文库上搜索。
WindowsCE嵌入式高级编程及其实例详解6
第6章文件
在当今的信息社会,文件对于人们来讲,都是再熟悉不过的。
人们可以通过定义文件的
格式来存储特定的数据。
在嵌入式系统中,人们更加迫切地需要通过文件来存储应用程序配置
信息或存储应用程序所需的资源数据。
因此在本章中,将重点介绍对文件的操作,其中包括对
文件的读写等,并以一个学生数据文件为例来综合讲述文件的具体操作。
作
式
本章主要包括如下内容:
·文件基本操作
·文件综合操作示例
·内存映射文件
·文件系统管理
·注册表编程
6.1文件基本操作
作。
在下面介绍文件操
的APl函数,另一种方
因为CFile类只是对原
始文件操作的APl函数进行了封装。
1.文件的创建与打开
如果要创建新文件或者打开已存在的文件,可以通过WindowsCE提供的CreateFile函数
来实现,该函数的定义如下:
HANDLECreateFile(
LPCTSTRipFileName,
DWORDdwDeSiredAcceSs,
DWORDdwShareMode,
LPSECURITY—ATTRIBUTESipSecurityAttributes,
DWORDdwCreati。
nDisp。
sti。
n,
DWORDdwFlagsAndAttributeS,
HANDLEhTemplateFile
1:
二参数‘lpFileName用于指定要创建或打开的文件的文件名。
此文件名应包括文件的完
整路径,如果参数中未包含路径信息,系统则默认在对象存储库的根目录下:
·参数dwDesiredAccess用于指定文件的访问权限,该参数的取值及其含义如表6_1
所示。
,
·参数dwShareMode用于指定可以赋予其他进程的访问权限,该参数的取值及其含义
如表6.2所示。
表6-1dwDesiredAccess参数的取值及其含义表
值
描述
GENERIC—READ
可以读取文件内容’
GENERIC——WRITE
可以向文件写入内容
GENERIC—READlGENERIC_WRITE
可以读取文件内容,也可以向文件写入内容
O
既没有读取权限,也没有写入权限,只能用来获取文件属性
表6.2dwShareMode参数的取值及其含义表
值
描述
FILE——SHARE——READ
表示其他进程打开文件时的访问权限为只读时,成功
FILE——SHARE——WRITE
表示其他进程打开文件时的访问权限为只写时,成功
·参数lpSecurityAttributes用于指定文件访问的安全属性,由于CE不支持该参数,因
此应设置为NULL值。
·参数dwCreationDispostion用于指定创建或打开文件的方式,该参数的取值及其含义
如表6.3所示。
表6-3dwCreationDispostion参数的取值及其含义表
值
描述
CREATE——NEW
创建一个新文件,如果该文件已存在,则函数执行失败
CREATE——ALWAYS
创建一个新文件,如果该文件已存在,则覆盖此文件,并清空已
存在的属性
OPEN—EXISTING
打开已存在的文件,如果文件不存在,则函数执行失败
OPEN——ALWAYS
打开已存在的文件,如果文件不存在,则创建一个新文件
TRUNCATE——EXISTING
打开已存在的文件,并将其截断到0字节。
如果文件不存在,则
函数执行失败
·参数dwFlagsAndAttributes用于指定文件的属性,该参数的取值及其含义如表6.4
所示。
表6_4dwFlagsAndAttributes参数的取值及其含义表
值
描述
FILE——ATTRIBUTE——ARCHIVE
设置文件为存档属性
FILE——ATTRIBUTE——HIDDEN
设置文件为隐藏属性
FILE——ATTRIBUTE——NORMAL
默认属性
FILE—ATTRIBUTE—READONLY
设置文件为只读属性
FILE——ATTRIBUTE——SYSTEM
设置文件为系统属性,以表明该文件对系统操作很重要
FILE——ATTRIBUTE——TEMPORARY
在CE中不支持
WindowsCE嵌入式高级编程及其实例详解(用c++实现)
表6-5dwFlagsAndAttributes参数的捆绑属性
值
描述
FILE—FLAG—WRITE—THROUGH
对文件的写操作不会存储到内存中
FILE——FLAG——RANDOM——ACCESS
向系统表明该文件将被随机访问而不是顺序访问,此标志有助
于系统确定用于该文件的高速缓存策略
FILE_FLAG_SEQUENTIAL_SCAN+
向系统表明该文件按照从头到尾顺序访问,此标志有助于系统
优化文件缓冲
·参数hTemplateFile在WindowsCE中不被支持,因此应将其设为0值。
如果CreateFile函数调用成功,则返回已创建或己打开的文件句柄,如果函数调用失败,
则返回INVALIDHANDLEVALUE值。
如果想知道函数调用失败的原因,可以调用
GetLastError函数查看。
例如,打开已存在的文件,代码如下:
HANDLEhFilej
hFile=CreateFile(T(”\\MyDocumentS\\MYFILE.TXT”),//打开MYFILE.TXT
GENERICREAD,//为读取而打开’
FILESHAREREAD,//共享读取
NULL,//没有安全设置
OPENEXISTING,//打开仅存在的文件
FILEATTRIBUTENORMAL,//正常属性
NULL);//没有模板文件
1f(hFile。
2INVALID—HANDLE_VALUE)
{
AfxMessageBox(T(时丁开失败’’));
return;
}
)
除了利用CreateFile函数创建或打开文件外,还可以通过CFile类的构造函数或其0pen
函数创建或打开文件。
CFile类构造函数的定义如下:
CFile(
LPCTSTRipszFileName,
UINTnOpenFlags);
·参数lpszFileName用于指定要创建或打开的文件的文件名。
其含义与CreateFile函数
的第一个参数lpFileName的含义相同。
·参数nOpenFlags用于指定创建或打开文件的方式,该参数的主要取值及其意义如表
6-6所示。
表6-6nOpenFiags参数的取值及其含义表
值
描述
Cfile:
:
modeCreate
表示创建一个新文件,如果文件已经存在,则文件内容将被置空
CFile:
:
modeNoTruncate
如果文件不存在,就创建一个新文件,如果文件存在,则打开它
CFile:
:
modeRead
打开此文件,并且只能执行读操作
第6章文件
续表
值
,描述
CFile:
:
modeReadWrite
打开此文件,可以执行读写操作
CFile:
:
modeWrite
打开此文件,并且只能执行读操作
CFile:
:
shareDenyNone
打开此文件,并且允许别的进程读写此文件‘
CFile:
:
shareDenyRead
打开此文件,并且拒绝别的进程对此文件执行读操作
CFile:
:
shareDenyWrite
打开此文件,并且拒绝别的进程对此文件执行写操作
CFile:
:
shareExclusive
打开此文件,并且拒绝别的进程对此文件执行读写操作
还可以使用CFile:
:
0pen函数来创建或打开文件,它的定义如下:
virtualBOOLOpen(
LPCTSTRipszFileName,
UINTnopenFlags,
CFileException+pError=NULL
)j。
Open函数的前两个参数与CFile构造函数的两个参数的含义相同;参数pError用于捕获
操作文件失败时的异常。
2.关闭文件
在使用完文件之后应及时关闭,以释放对它的占有权。
如果要关闭已打开的文件,只需
要调用CloseHandle函数即可,该函数的声明如下:
BOOLCioSeHandle(
HANDLEhObject
)j
其中参数hObject就是CreateFile函数的返回值。
CloseHandle是个常用函数,使用它可以
关闭许多句柄。
对应于CFile类,可以直接调用它的Close方法关闭文件。
3.文件的读写
WindowsCE提供了ReadFile函数来读取文件中的内容,它的定义如下:
BOOLReadFile(
HANDLEhFile,
LPVOIDlpBuffer,
DWORDnNumberOfBy七esToRead,
LPDWORDlpNumberofBy七esRead,
LPOVERLAPPEDlpOVerlapped、
);
·参数hFile用于指定文件句柄,也就是CreateFile函数的返回值。
、·参数lpBuffer用于指定接收数据的缓冲区。
·参数nNumberOfBytesToRead表示要从文件中读取的字节数。
·参数lpNumberOfBytesRead表示实际从文件中读取的字节数。
·参数lpOverlapped在WindowsCE中不支持,应设置成NULL值。
调用ReadFile函数读取文件数据,是从当前文件的偏移量开始,读取完数据后,文件偏
170WindowsCE嵌入式高级编程及其实例详解(用c++实现)
移量移动至读取数据之后。
使用该函数读取文件数据,将不会超出文件末尾。
如果调用ReadFile
函数读取超出文件剩余部分的字节数,调用仍会成功,但返回的字节数只是文件剩余部分的字
节数。
函数执行成功就返回TRUE值,否则返回FALSE值。
如果要向文件中写入内容,调用WriteFile函数即可,它的定义如下:
BOOLWriteFile(
HANDLEhFile,
LPCVOIDlpBuffer,
DWORDnNumberofBytesToWrite,
LPDWORDlpNumberOfBytesWritten,
LPOVERLAPPEDlpOverlapped
);
·参数hFile用于指定文件句柄,也就是CreateFile的返回值。
·参数lpBuffer用于指定将要向文件写入数据的数据缓冲区。
·参数nNumberOfBytesToWrite指定将写入文件的数据的字节数。
·参数lpNumberOfBytesWritten表示实际写入文件的数据的字节数。
·参数lpOverlapped在WindowsCE中不支持,应设置为NULL值。
调用WriteFile函数向文件写入数据,也是从当前文件偏移量开始。
如果函数调用成功,
返回TURE值,否则返回FALSE值。
CFile类提供了Read和Write方法来读取和写入文件数据。
CFile:
:
Read和CFile:
:
Write方
法的定义如下:
vlrtus上v01clwrlte(
constvoid+ipBuf,+
UINTnCount);
在Read方法里,参数lpBuf表示存储读取的文件数据缓冲区;参数nCount表示从文件中
读取的最大数据量:
函数返回值表示实际读取的数据量,该值可能小于nCount的值。
在Write方法里,参数IpBuf表示将要写入文件的数据缓冲区;参数nCount表示lpBuf的
大小。
CFile类的Read方法和Write方法都是从文件的当前指针处开始进行读写。
4.文件指针的移动
在读写文件时,都是从文件的当前位置开始的,那么有没有方法可以设置读写的当前位
置呢?
WindowsCE就提供了SetFilePointer函数用于设置文件指针,它的定义如下:
DWORDSetFilePointer(
HANDLEhFile,
LONGlmiStanceToMove,
PLONGipDistanceToMoveHigh,
DWORDdwMoveMethod
n
·参数hFile用于指定文件旬柄,也即是CreateFile函数的返回值。
d
a
e
R
●,
T^,)
Nft
工Un
UBU
po
llC
an
U★
tdT
riN
.10I
VVU
·参数IDistanceToMove用于指定有符号的32位偏移量。
。
·参数lpDistanceToMoveHigh用于指定~个辅助的32位偏移量,它在文件指针移动距
离超出4G时开始使用,大多数情况下,该参数都被设置成NULL值。
·参数dwMoveMethod表示偏移量计算方式,它有如表6.7所示的取值。
表6-7dwMoveMethod参数的取值及其含义表
值
描述
FILE—BEGIN
从文件的首部开始计算
FILE——CURRENT
从文件的当前位置开始计算
FILE—END
从文件的末尾位置开始计算
同样CFile类也提供了操作文件指针的3个方法,分别是Seek、SeekToBegin和SeekToEnd,
这3个方法的声明如下:
virtualLONGSeek(
LONGiOff,
UINTnFrom)j
DWORDSeekToEnd()j
方法Seek类似WindowsCEAPl函数SetFilePointer,其中参数10ft表示偏移量;参数nFrom
表示偏移量计算方式,同样它也有三个取值,具体说明如表6—8所示。
表6.8参数nFrom的取值及其含义表
值
描述
CFile:
:
begin
从文件的首部开始计算
CFile:
:
current
从文件的当前位置开始计算
CFile:
:
end
从文件的末尾位置开始计算
方法SeekToBegin会将文件指针直接移动到文件首部;方法SeekToEnd会将文件指针直接
移动到文件尾部。
下面将举例说明以上APl函数的使用,该例子将把第l个文件的内容追加到第2个文件
中,代码如程序清单6.1所示。
/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序清单6—1★★★★★★★★★★★★★★★★★★★★★★+/
HANDLEhFile,hAppend;
DWORDdwBytesRead,dwBytesWri七ten;
charbuff[4096];
//创建一个新文件
hFile=CreateFile(T(”\\ONE.TXT”),//创建One.txt
GENERICREADlGENERICWRITE,//为读写而打开
0,//没有共享
NULL,//没有安全设置
172
(用C++实现)
溅
攀豳糊
if(hFil
f
L
翟
r
for(inti=0;i<100;i++)
{
WriteFile(hFile,buf,wcslen(buf)+2,&dwBytesWritten,NULL);
)
//打开Tw。
.txt,如果不存在创建一个新文件
hAmDend:
CreateFile(T(”\\TW0.TXT’’),//打开或创建Tw0·txt
GENERICWRITE.//为写而打开
0.//没有共享
NULL.//没有安全设置
OPENALWAYS,//打开或新建
//设置第一个文件偏移指针,在文件首部
SetFilePointer(hFile,0,NULL,FILE—BEGIN);
//设置第二个文件偏移指针,在文件尾部
SetFilePointer(hAppend,0,NULL,FILE—END)j
//将第一个文件追加到第二个文件末尾
do
{
if(ReadFile(hFile,buff,4096,&dwBytesRead,NULL))
WriteFile(hAppend,buff,dwBytesRead,
&dwBytesWritten,NULL);
)
一
}
while(dwBytesRead==4096);
//关闭两个文件
CioseHandle(hFile);
CloseHandle(hAppend);
/+++++++++++++++++++★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/
5.获取和设置文件信息.
(I)获取和设置文件属性。
WindowsCE提供了GetFileAttributes方法和SetFileAttributes方法来获取和设置文件属性。
GetFileAttributes方法的定义如下:
DWORDGetFileAttributes(
LPCTSTRipFileName
)j
参数lpFileName表示文件名或者目录名。
.
该函数的返回值是DWORD类型,具体的返回值及其含义如表6-9所示。
如果返回值是
DxFFFFFFFF,则表示函数执行失败。
表6.9文件属性值及其含义表
值
描述
FILE—ATTRIBUTE_ARCHIVE
此文件或目录具有存档属性,应用程序将根据此属性标识此文
件或目录是否备份或删除
FILE——ATTRIBUTE——COMPRESSED,
此文件或目录是压缩的。
对于一个文件来说,文件中的所有数
据是被压缩的。
对于一个目录来说,它其中的文件或子目录被
新建时,默认是压缩的
FILE——ATTRIBUTE——DIRECTORY
表示参数IpFileName指定的是一个目录,而不是文件
FILE——ATTRIBUTE——ENCRYPTED
文件或目录是被加密的。
对于一个文件来说,文件的所有数据
是被压缩的。
对于一个目录来说,它其中的文件或子目录被新
建时,默认是加密的
FILE——ATTRIBUTE——HIDDEN
文件或目录是隐藏的
FILE——ATTRIBUTE——INROM
文件在ROM中,是只读的,不能被修改
FILE——ATTRIBUTE——NORMAL
文件或目录具备正常属性
FILE翼TRIBUTE—READONLY
文件或目录是只读的。
应用程序可以读取文件内容,但是不能
修改文件内容
FILE——ATTRIBUTE——REPARSE——POINT
文件包含重解析点属性,
FILE.。
ATTRIBUTE——ROMMODULE
文件是ROM的一个可执行模块,该文件被格式化为可以加载以
立刻执行。
此文件不能利用CreateFile函数打开
FILE.—ATTRIBUTE——ROMSTATICREF
这个文件是个DLL模块,并且它静态引用了系统映象中的文件
FILE——ATTRIBUTE——SPARSE——FILE
此文件是一个稀少文件
FILE..ATTRIBUTE——SYSTEM
文件或目录是系统的一部分或专门被系统调用的
FILE——ATTRIBUTE..TEMPORARY
文件被当作临时文件使用
FILE_ATTRIBUTE_ROMSTATICREF
表示这个DLL模块被静态连接到ROM中别的模块。
此DLL不
能被别的位置具有相同文件名的模块取代
174WindowsCE嵌入式高级编程及其实例详解(用c++实现)
设置文件属性的方法也非常简单,只需要调用SetFileAttributes函数即可。
BOOLSetFileAttributeS(
LPCTSTRipFileName,
DWORDdwFileAttributes
);
其中参数lpFileName表示文件名或目录名;参数dwFileAttributes表示文件属性,它的取
值请参考GetFileAttributes的返回值。
程序清单6—2中的代码演示了调用GetFileAttributes方法以获取文件属性的方法。
/★★★★★★★★★★★★★★★★★★★★★★★★士★★程户手清单6-2★★★★★★★★★★★★★★★★女★★★★★+/
//打开文件对话框,选择文件
CFileDialogdlgFile(true,一T(”ALL”),NULL,OFN—HIDEREADONLYlOFN一0VERWRITEPROMPT
_T(”ALLFiles(+.+)I+.“’))j
if(dlgFile.DoModal()==IDOK)
{
CStringfileName=dlgFile.GetPathName();
DWORDdwFileAttr=GetFileAttributeS(fileName)j
//判断函数是否执行失败
if(dwFileAttr==OxFFFFFFFF)
f’
TRACE(Ln得到文件属性失败”);
retUrnj
)
//通过dwFileAttr来识别文件包含哪些属性
if』dwFileAttr&FILEATTRIBUTEARCHIVE)
{
TRACE(L--文件具有存档属性\n”);
)
if(dwFileAttr&FILEATTRIBUTECOMPRESSED)
{
TRACE(L”文件具有压缩属性\n”);
}
if(dwFileAttr&FILEATTRIBUTEHIDDEN)
{
TRACE(L”文件具有隐藏属性\n”);
)’
if(dwFileAttr&FILEATTRIBUTENORMAL)
{
TRACE(L”文件具有正常属性\n”);
)
if(dwFileAttr&FILE—ATTRIBUTE—READONLY)
{
TRACE(L”文件具有只读属性\n--);
}
)
/★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/
(2)获取和设置文件时间。
WindowsCE的文件时间包括3种,分别是文件被创建的时间、文件最后一次被访问的时
间(包括读取、写入和执行)和文件最后一次被修改的时间。
WindowsCE提供了GetFileTime
方法和SetFileTime方法来获取和设置文件时间,这两个方法的定义如下:
BOOLGetFileTime(
HANDLEhFile,
LPFILETIMEipCreationTime,
LPFILETIMElpLastAccessTime,
LPFILETIMElpLastWriteTime
);
BOOLSetFileTime(
HANDL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows CE嵌入式高级编程及其实例详解6 CE 嵌入式 高级 编程 及其 实例 详解