网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
源代码在线查看: 12.4.1 文件的创建和打开.txt
12.4.1 文件的创建和打开
CreateFile函数将创建或打开下列对象,并返回一个用于读取该对象的句柄。
·
文件
·
管道
·
邮槽
·
通信资源
·
磁盘设备(仅适用于 Windows NT平台 )
·
控制台
·
目录(仅适用于打开操作)
由此可见, CreateFile函数不仅可以对文件对象进行操作,还可以对其他多种对象进行创建和打开
操作。该函数的原型声明如下所示。
HANDLE CreateFile(
LPCTSTR lpFileName, .
DWORD dwDesiredAccess, ,
DWORD dwShareMode ,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes ,
HANDLE hTemplateFile
CreateFile函数的参数比较多,各个参数的含义分别如下所述:
. IpFileName
指定用于创建或打开的对象的名称。
. dwDesiredAccess
指定对对象的访问方式,应用程序可以得到读访问、写访问、读写访问或设备查询访问等类型,此
参数可以是如表 12.6所示各值的任意组合。
表 12.6 dwDesiredAccess参数取值
.
对象访问方式 说明
。 指定对对象具有设备查询访问
GENERICREAD 指定对对象具有读访问。可以从文件中读取数据,并且可移动文件中的指针 .如果与
GENERIC_WRITE联合使用可以得到对对象的读和写访问
GENERIC_WRITE 指定对对象具有写访问。可以向文件中写入数据,并且可移动文件中的指针 .如果
与 GENERIC_READ联合使用可以得到对对象的读-写访问
.
'-
MhF
. dwShareMode
指定共享方式。如果将此参数设置为 0,那么对象不能被共享,后续对该对象进行打
开操作将会失败,直到关闭句柄为止。 为达到对象共享效果,可以使用如表 12.7所示各值
中的一个或多个值的组合。
表 12.7 dwShareMode参数取值
共享方式 说明
FILE_SHARE_DELETE Windows NT/2000系统下,如果是请求删除访问,对对象后续打开操作将成功
FILE SHARE READ 如果是请求读访问,那么对对象后续打开操作将成功
FILE SHARE WRITE 如果是请求写访问,那么对对象后续打开操作将成功
. lpSecurityAttributes
指向一个 SECURITYj';'τTRIBUTES结构的指针,用来确定返回的句柄是否能够被子进程所继承。
实际上,这个参数用来指定我们所创建的文件对象的访问权限,以及返回的文件对象句柄是否能够
被子进程所继承。
SECURITY 1\τTRIBUTES结构的定义如下所示。
typedef struct _SECUR工 TY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL blnheritHandle;
} SECUR工 TY_ATTR工 BUTES; '
其中与安全相关的只有一个成员: lpSecurityDescriptor,它指定了对象的安全描述符。如果将该
参数指定为 NULL,说明将创建一个具有默认安全权限的对象,但是这时所返回的文件对象句柄不能
被子进程继承,默认的安全性意味着这个对象的管理成员和创建者拥有对该对象的全部访问权,而
其他人均无权访问这个对象。读者应注意,这个参数只有在服务器端的操作系统下才有意义,例如
Windows NT和 Windows 2000系统,在 Windows 95 和 Windows 98系统下是没有意义的,因为
Windows95和 Windows98系统不支持安全性。我们通常在创建服务器端软件时使用这个参数,在客户
端程序中很少使用这个参数,所以下面的例子中直接给它传递了一个 NULL值,让对象使用默认的安
全性。
. dwCreationDisposition
指定如何创建文件。此参数必须是如表 12.8所示值之一。
表 12.8 dwCreationDisposition参数取值
dwCreationD isposition参数取值 说明
CREATE NEW 创建一个新文件,如果指定的文件已经存在,则函数调用失败
CREATE ALWAYS 创建一个新文件,如果文件存在,函数重写文件且清空现有属性
OPEN EXISTll唱G 打开文件,如果文件不存在,则函数调用失败
OPEN ALWAYS 如果文件存在,则打开文件:如果文件不存在,贝IJ函数的行为就像 dwCreatio n
Disposition参数取 CREATE NEW值一样创建文件
TRUNCATE EXISTll吨G 打开文件,一旦文件打开,文件被截取以便它的大小为 0字节,调用函数必
须用 GENERIC WRITE访问来打开文件,如果文件不存在,则函数调用失败
.
. dwFlagsAndAttributes
设置文件属性和标志,该参数可取如表12.9所示属性中的任意组合。表12.9 dwFlagsAndAttributes
参数取值(一〉
dwFlagsAndAttributes参数取值 说明
FILE_AITRIBU'IE_ARCHIVE 该文件是存档文件,应斥陪序用此属性标记文件的备份或删除 .
FILE A1TRIBUTE HIDDEN 该文件是隐藏文件,它不包括在一般目录列表中
FILE A1TRIBU'IE NORMAL 该文件没有其他属性设置。该属性只有在单独使用时才有效
FILE A1TRIBlITtOFFLINE 文件的数据不能立即使用。表明该文件数据已经在物理上移动到离线存
储设备中
FILE_A1TRIBU1b,_READONLY 该文件是只读文件,应用程序可以读取该文件中的内容,但不能向该
文件中写入 内容,或删除该文件
FILE A1TRIBU1BSYSTEM 该文件是操作系统文件
FILE_A1TRIBIJ It-_TEMPORARY 该文件做暂时存储使用。如果有足够的Cache内存可用,那么文件
系统将会把所 有数据存储在该内存中,而不是将它们写回大容量存储器中。当不再需要临时文件时,
应用程序通常会立即删除它
FILE_FLAG_ WRITE_THROUGH 指示系统不经过缓存而直接将数据写入磁盘。如果没有指定 HIE,
_FLAG_ NO_BUFFER1NG标志,那么系统写缓存机制仍有效,但同时数据会主即写入磁盘: 如果同时指
定了FILE_FLAG.O_BUFFERING标志,那么系统写缓存机制无效,数据将不被写入缓存,而直接写入磁
盘。但并不所有的硬件都具备这种写直通能力
FILE_FLAG_OVERLAPPED 指不系统初始化该文件对象,以便那些需要较长时间才能完成的操作返回
ERROR_IO_ PENDING标志。当这种操作完成肘,事先指定的事件将被设置为有信号状态
FILE_FLAG_NO_BUFFE,RING 指示系统以不带系统缓冲的方式打开该文件。当与
FILE_FLAG_OVERLAPPED 标志综合使用时,能提供最大的异步性能,因为此时110操作将与内存管理
器的同步操作无关。但是因为数据没有被缓存,所以一些110操作可能会花费更长的时间
FILE_FLAG_RANDOM_ACCESS 指示该文件是随机访问方式
FILE_FLAG_SEQUENTlAL_SCAN 指示该文件是顺序访问方式
FILE_FLAG_DELETE_ON_CLβSE 指本当该文件的所有句柄〈并不仅仅是指定 HIE,_FLAG_DEL町
E_ON_CLOSE 标志的那个句柄)都被关闭之后,操作系统将立即删除该文件
FILE_FLAG_BACKUP _SEMANTICS 在Windows NT以上的操作系统中,此标志表明是为备份或存储操作
而打开或创 建该文件的。
FILE_FLAG_POSIX_SEMANTICS 表明将根据POSIX规则访问该文件。这包括允许系统支持这样的文件
命名2多个 文件具有相同名称,但是大小写不同。使用这一选项时应注意,因为用此标志创建的文
件不能被MS-DOS或16位Windows应用程序所访问
FILE_FLAG_OPEN_REPARSE_POlNT 指定此标志禁止N'IFS再分析点的再分析行为。当打开文件时,将
返回一个文件 句柄,而不管控制再分析点的过滤器是否运作
FILE_FLAG_OPEN_NO_RECALL 表明虽然请求了该文件的数据,但该数据仍应继续保存在远程存储器
中,而不应 被传回本地存储器。此标志是给远程存储系统系统使用的
.
如果CreateFile函数打开命名管道的客户端,那么dwFlagsAndAttributes参数也可以包含服务信息
的安全特性。当调用程序指定了 SECURITY_SQOS_PR~SENT标志, dwFlagsAndAttributes参数可以包
含表12.10所列值中的一个或多个。
表12.10 dwFlagsAndAttributes参毅取值 (二)
dwF1agsAndAttributes参数取值
SECURITY ANONYMOUS
SECURITY IDENTIFICATION
SECURITY IMPERSONATION
SECURITY DELEGATION
SECURlTY CONTtXT TRACKING
.
SECURITY_EFFbCTNE_ONLY
. hTemplateFile
说明 指定在Anonymous模拟级别模拟客户 指定在Identification模拟级别模拟客户 指定在
Impersonation模拟级别模拟客户 指定在Delegation模拟级别模拟客户 指定安全跟踪模式是动态
的。如果没有指定此标志,安全跟踪模式是静态的指定只有客户端安全属性中那些可用的属性对服
务器端是可用的。如果没有指
定此标志,那么服务器可以使用客户端安全属性的所有方面
指定具有GENERIC_READ访问方式的模板文件的句柄。如果为此参数传递了一个文
件句柄,那么CreateFile函数会忽略为所创建的文件设置的属性标志,而使用hTemplateFile
相关联的文件的属性标志。读者一定要注意, hTemplateFile必须是使用GENERICREAD
方式打开的。另外,如果是打开一个现有文件,而不是创建一个新文件,则这个参数将被
忽略。因此如果希望这个参数有效,必须满足两个条件:一个是创建新文件:一个是给 hTemplateFile
参数传递的文件句柄必须是使用GENERIC_READ方式打开的。