函数 CreateFile 可以创建一个新文件或者打开一个已有文件。如果调用成功,函数返回打开文件的句柄;否则,返回特殊常数 INVALID_HANDLE_VALUEO 原型如下:
下表对参数进行了说明。如果函数调用失败则返回值为零。
参数 | 说明 |
---|---|
lpFileName | 指向一个空字节结束字符串,该串为部分或全部合格的文件名(drive:\path\filename) |
dwDesiredAccess | 指定文件访问方式(读或写) |
dwShareMode | 控制多个程序对打开文件的访问能力 |
lpSecurityAttributes | 指向安全结构,该结构控制安全权限 |
dwCreationDisposition | 指定文件存在或不存在时的操作 |
dwFlagsAndAttributes | 包含位标志指定文件属性,如存档、加密、隐藏、普通、系统和临时 |
hTemplateFile | 包含一个可选的文件模板句柄,该文件为已创建的文件提供文件属性和扩展属性;如果不使用该参数,就将其设置为 0 |
参数 dwDesiredAccess 允许指定对文件进行读访问、写访问、读/写访问,或者设备查询访问。可以从下表列出的值中选择,也可以从表中未列出的更多特定标志值选择。
值 | 含义 |
---|---|
0 | 为对象指定设备查询访问。应用程序可以查询设备属性而无需访问设备,也可以检查文件是否存在 |
GENERIC_READ | 为对象指定读访问。可以从文件中读取数据,文件指针可以移动。与 GENERIC_WRITE 一起使用为读/写访问 |
GENERIC_WRITE | 对对象指定写访问。可以向文件中写入数据,文件指针可以移动。与 GENERIC_READ 一起使用为读/写访问 |
参数 dwCreationDisposition 指定当文件存在或不存在时应采取怎样的操作。可从下表中选择一个值。
值 | 含义 |
---|---|
CREATE_NEW | 创建一个新文件。要求将参数 dwDesiredAccess 设置为 GENERIC_WRITE。如果文件已经存在,则函数调用失败 |
CREATE_ALWAYS | 创建一个新文件。如果文件已存在,则函数会覆盖原文件,清除现有属性,并合并文件 属性与预定义的常数 FILE_ATTRIBUTES_ARCHIVE 中属性参数指定的标志。要求将参数 dwDesiredAccess 设置为 GENERIC WRITE |
OPEN_EXISTING | 打开文件。如果文件不存在,则函数调用失败。可用于读取和/或写入文件 |
OPEN_ALWAYS | 如果文件存在,则打开文件。如果不存在,则函数创建文件,就好像CreateDisposition 的值为 CREATE NEW |
TRUNCATE_EXISTING | 打开文件。一旦打开,文件将被截断,使其大小为零。要求将参数 dwDesiredAccess 设置为 GENERIC_WRITE。如果文件不存在,则函数调用失败 |
下表列出了参数 dwFlagsAndAttributes 比较常用的值。(完整列表请在 Microsoft 在线文档中搜索CreateFiko)允许任意属性组合,除了 FILE_ATTRIBUTE_NORMAL 会被其他 所有属性覆盖。这些值能映射为 2 的幂,因此可以用汇编时 OR 运算符或 + 运算符将它们组 合为一个参数:
属性 | 含义 |
---|---|
FILE_ATTRIBUTE_ARCHIVE | 文件存档。应用程序使用这个属性标记文件以便备份或移动 |
FILE_ATTRIBUTE_HIDDEN | 文件隐藏。不包含在普通目录列表中 |
FILE_ATTRIBUTE_NORMAL | 文件没有其他属性设置。该属性只在单独使用时有效 |
FILE_ATTRIBUTE_READONLY | 文件只读。应用程序可以读文件但不能写或删除文件 |
FILE_ATTRIBUTE_TEMPORARY | 文件被用于临时存储 |
【示例】下面的例子仅具说明性,展示了如何创建和打开文件。请参阅在线从 Microsoft文 档,了解 CreateFile 更多可用选项:
打开并读取(输入)已存在文件:
INVOKE CreateFile,
ADDR filename, ;文件名指针
GENERIC_READ, ;读文件
DO_NOT_SHARE, ;共享模式
NULL, ;安全属性指针
OPEN_EXISTING, ;打开已存在文件
FILE_ATTRIBUTE_NORMALA ;普通文件属性
0 ;未使用
打开并写入(输出)已存在文件。文件打开后,可以通过写入覆盖当前数据,或者将文件指针移到末尾,向文件添加新数据(参见11.1.6节的SetFilePointer):
INVOKE CreateFile,
ADDR filename,
GENERIC_WRITEZ, ;写文件
DO_NOT_SHARE,
NULL,
OPEN_EXISTIN, ;文件必须存在
FILE_ATTRIBUTE_NORMAL,
0
创建有普通属性的新文件,并删除所有已存在的同名文件:
INVOKE CreateFile,
ADDR filename,
GENERIC_WRITE, ;写文件
DO _NOT_SHARE,
NULL,
CREATE_ALWAYS, ;覆盖已存在的文件
FILE_ATTRIBUTE_NORMAL,
0
若文件不存在,则创建文件;否则打开并输出现有文件:
INVOKE CreateFile,
ADDR filename,
GENERIC_WRITE, ;写文件
DO_NOT_SHARE,
NULL,
CREATE_NEW, ;不删除已存在文件
FILE_ATTRIBUTE_NORMAL,
0