汇编语言CreateFile函数:创建新文件或者打开已有文件


函数 CreateFile 可以创建一个新文件或者打开一个已有文件。如果调用成功,函数返回打开文件的句柄;否则,返回特殊常数 INVALID_HANDLE_VALUEO 原型如下:

CreateFile PROTO,                                ;创建新文件
    lpFilename:PTR BYTE,                       ;文件名指针
    dwDesiredAccess:DWORD,              ;访问模式
    dwShareMode:DWORD,                  ;共享模式
    lpSecurityAttributes:DWORD,          ;安全属性指针
    dwCreationDisposition:DWORD,     ;文件创建选项
    dwFlagsAndAttributes:DWORD,      ;文件属性
    hTemplateFile:DWORD                    ;文件模板句柄

下表对参数进行了说明。如果函数调用失败则返回值为零。

参数  说明
lpFileName 指向一个空字节结束字符串,该串为部分或全部合格的文件名(drive:\path\filename)
dwDesiredAccess 指定文件访问方式(读或写)
dwShareMode 控制多个程序对打开文件的访问能力
lpSecurityAttributes 指向安全结构,该结构控制安全权限
dwCreationDisposition 指定文件存在或不存在时的操作
dwFlagsAndAttributes 包含位标志指定文件属性,如存档、加密、隐藏、普通、系统和临时
hTemplateFile 包含一个可选的文件模板句柄,该文件为已创建的文件提供文件属性和扩展属性;如果不使用该参数,就将其设置为 0

dwDesiredAccess

参数 dwDesiredAccess 允许指定对文件进行读访问、写访问、读/写访问,或者设备查询访问。可以从下表列出的值中选择,也可以从表中未列出的更多特定标志值选择。

含义
0 为对象指定设备查询访问。应用程序可以查询设备属性而无需访问设备,也可以检查文件是否存在
GENERIC_READ 为对象指定读访问。可以从文件中读取数据,文件指针可以移动。与 GENERIC_WRITE 一起使用为读/写访问
GENERIC_WRITE 对对象指定写访问。可以向文件中写入数据,文件指针可以移动。与 GENERIC_READ 一起使用为读/写访问

dwCreationDisposition

参数 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_HIDDEN OR FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_HIDDEN + FILE_ATTRIBUTE_READONLY


属性 含义
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