创建文件 c语言,汇编语言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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟设备对象并不对应一个实际的物理设备,而是由驱动程序创建的一个逻辑设备。因此,您不能使用CreateFile函数直接打开FILE_DEVICE_VIDEO设备文件。 如果您想要访问虚拟设备对象,您需要使用设备接口来与驱动程序进行通信。这需要您进行驱动程序开发,并编写相应的设备控制代码。 以下是一个简单的示例,用于在用户空间打开虚拟设备对象并向其发送请求: ``` #include <windows.h> #include <winioctl.h> #define MY_DEVICE_TYPE 40000 // 自定义设备类型 #define MY_IOCTL_CODE CTL_CODE(MY_DEVICE_TYPE, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) int main() { HANDLE hDevice; DWORD dwBytesReturned; char buffer[1024]; hDevice = CreateFile(L"\\\\.\\MyVideoDevice", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hDevice == INVALID_HANDLE_VALUE) { printf("Failed to open device, error code: %d\n", GetLastError()); return -1; } // 向设备发送请求 DeviceIoControl(hDevice, MY_IOCTL_CODE, NULL, 0, buffer, sizeof(buffer), &dwBytesReturned, NULL); CloseHandle(hDevice); return 0; } ``` 在上面的示例中,我们使用CreateFile函数打开名为\\.\MyVideoDevice的设备接口,并向其发送一个自定义的设备控制请求。 需要注意的是,这只是一个简单的示例,实际情况下,您需要根据您的具体需求编写相应的设备控制代码,以实现您的业务逻辑。同时,也需要注意保证您的代码安全可靠,避免造成系统崩溃等严重后果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值