CreateFile 函数详细解析

CreateFile 函数详细解析前言 在 Windows 编程中 CreateFile 函数是用得非常多的 由于它的参数比较多比较复杂 在使用的时候容易出现问题 在学习了 MSDN 的官方文档后打算将其原文翻译出来 以供参考 如有错误 欢迎指正 lcb0281 163 点 comCreateFil 创建或打开文件或 I O 设备 常用的 I O 设备有 文件 文件流 目录 物理磁盘 卷 控制台缓冲区 磁带驱动器 通信资源 邮筒和管道

前言:
    在Windows编程中CreateFile函数是用得非常多的,由于它的参数比较多比较复杂,在使用的时候容易出现问题,在学习了MSDN的官方文档后打算将其原文翻译出来,以供参考,如有错误,欢迎指正:lcb0281@163点com

CreateFile 
    创建或打开文件或I/O设备。常用的I/O设备有:文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带驱动器,通信资源,邮筒和管道。该函数返回一个句柄,该句柄可用于根据文件或设备以及指定的标志和属性访问文件或设备以获取各种类型的I/O。
    要将此操作作为事务操作执行,这会导致可用于事务I / O的句柄,请使用CreateFileTransacted函数。

句法:














HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile );

参数:

lpFileName [in]

    要创建或打开的文件或设备的名称。 可以在这个名字中使用正斜杠(/)或反斜杠(\)【注意/是转义符号】。在该函数的ANSI版本中,该名称仅限于MAX_PATH字符。要将此限制扩展为32,767个宽字符,请调用该函数的Unicode版本并将“\\?\”添加到路径中。更多内容请查看:Naming Files, Paths, and Namespaces.
    有关特殊设备名称的信息,请参阅:Defining an MS-DOS Device Name.
    要创建文件流,请指定文件的名称,冒号,然后指定流的名称。 有关更多信息,请参阅File Streams.
    提示:从Windows 10版本1607开始,针对此函数的unicode版本(CreateFileW),您可以选择删除MAX_PATH限制而不预先添加“\\?\”有关详细信息,请参阅命名文件,路径和命名空间的“Naming Files, Paths, and Namespaces ”部分。
dwDesiredAccess [in]
    所请求的文件或设备访问权限,这可以被概括为读,写,两者或非)。最常用的值是GENERIC_READGENERIC_WRITE或两者(GENERIC_READ | GENERIC_WRITE)。更多内容查看;Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
    如果此参数为零,则应用程序可以查询某些元数据(如文件,目录或设备属性),而不访问该文件或设备,即使GENERIC_READ访问已被拒绝。
    您无法请求与已打开句柄的打开请求中的dwShareMode参数指定的共享模式冲突的访问模式。
    有关更多信息,请参阅本主题的“备注”部分和Creating and Opening Files.
dwShareMode [in]
    文件或设备的请求共享模式,可以读取,写入,删除,全部或全部删除。对属性或扩展属性的访问请求不受此标志的影响。
    如果此参数为零且CreateFile成功,则文件或设备无法共享,并且无法再次打开,直到文件或设备的句柄关闭。
    你无法请求与在具有打开句柄的现有请求中指定的访问模式冲突的共享模式。 CreateFile将失败,GetLastError函数将返回ERROR_SHARING_VIOLATION。
    要启用进程在另一进程打开文件或设备时共享文件或设备,请使用以下一个或多个值的兼容组合。有关此参数与dwDesiredAccess参数的有效组合的更多信息,请查看Creating and Opening Files.
提示:每个打开的句柄的共享选项在该句柄关闭之前保持有效,而与流程上下文无关。




























Value Meaning
0x00000000  防止其他进程在请求删除,读取或写入访问时打开文件或设备。

FILE_SHARE_DELETE                               

0x00000004

启用文件或设备共享删除访问,否则,如果其他进程请求删除访问,则无法打开该文件或设备。如果未指定此标志,但文件或设备已被打开以进行删除访问,则该功能失败。

注意:除访问权限允许删除和重命名操作

FILE_SHARE_READ

0x00000001

启用文件或设备共享读访问,否则,如果其他进程请求读取访问权限,则无法打开文件或设备。如果未指定此标志,但文件或设备已被打开以进行读取访问,则该功能失败。

FILE_SHARE_WRITE

0x00000002

启用文件或设备共享写访问,否则,如果其他进程请求写访问权限,则无法打开该文件或设备。如果未指定此标志,但文件或设备已打开以进行写入访问或具有写入访问的文件映射,则该功能将失败。

lpSecurityAttributes [in, optional]
    指向SECURITY_ATTRIBUTES结构的指针,该结构包含两个独立但相关的数据成员:一个可选的安全描述符以及一个布尔值,该值确定返回的句柄是否可以被子进程继承。
    该参数可以是NULL。
    如果此参数为NULL,则由CreateFile返回的句柄不能由应用程序可能创建的任何子进程继承,并且与返回句柄关联的文件或设备将获得默认安全描述符。
    该结构的lpSecurityDescriptor成员为文件或设备指定SECURITY_DESCRIPTOR。如果此成员为NULL,则与返回句柄关联的文件或设备将被分配一个默认安全描述符。
    CreateFile在打开现有文件或设备时会忽略lpSecurityDescriptor成员,但会继续使用bInheritHandle成员。
    该结构的bInheritHandle成员指定是否可以继承返回的句柄。
dwCreationDisposition [in]
    采取存在或不存在的文件或设备的操作。
    对于文件以外的设备,此参数通常设置为OPEN_EXISTING。


















    该参数必须是以下值之一,不能组合:

Value Meaning

CREATE_ALWAYS

2

始终创建一个新文件。

如果指定的文件存在并且是可写的,则该函数覆盖文件,函数成功,并且最后的错误代码被设置为ERROR_ALREADY_EXISTS(183)。

如果指定的文件不存在并且是有效的路径,则会创建一个新文件,该函数成功,并且最后一个错误代码被设置为零。

CREATE_NEW

1
只有在不存在的情况下才创建一个新文件。
如果指定的文件存在,则该函数失败,并且最后的错误代码被设置为ERROR_FILE_EXISTS(80)。
如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。




OPEN_ALWAYS
4

总是打开一个文件。
如果指定的文件存在,则函数成功并且最后的错误代码被设置为ERROR_ALREADY_EXISTS(183)。
如果指定的文件不存在并且是可写位置的有效路径,则该函数将创建一个文件,并将最后一个错误代码设置为零。




OPEN_EXISTING
3

只有存在文件或设备时才打开。
如果指定的文件或设备不存在,则该函数将失败,并且最后一个错误代码将设置为ERROR_FILE_NOT_FOUND(2)。

TRUNCATE_EXISTING           
5

打开一个文件并截断它,以便它的大小为零字节,只要它存在。
如果指定的文件不存在,则该函数失败,并且最后的错误代码被设置为ERROR_FILE_NOT_FOUND(2)。
调用进程必须打开GENERIC_WRITE位设置为dwDesiredAccess参数的一部分的文件。




dwFlagsAndAttributes [in]
    文件或设备属性和标志FILE_ATTRIBUTE_NORMAL是文件最常用的默认值。
   此参数可以包含可用文件属性的任意组合(FILE_ATTRIBUTE_ *)。 所有其他文件属性都会覆盖FILE_ATTRIBUTE_NORMAL。
    此参数还可以包含用于控制文件或设备缓存行为,访问模式和其他特殊用途标志的标志组合(FILE_FLAG_ *)。 这些与任何FILE_ATTRIBUTE_ *值结合使用。
    此参数还可以通过指定SECURITY_SQOS_PRESENT标志来包含安全服务质量(SQOS)信息。
    当CreateFile打开现有文件时,它通常将文件标志与现有文件的文件属性组合在一起,并忽略作为dwFlagsAndAttributes的一部分提供的任何文件属性。
    官方文档中还有列出很多文件和设备属性和标志的表格,内容太多不再列出,建议参考原文。
hTemplateFile [in, optional]
    具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。
    该参数可以是NULL。
    打开现有文件时,CreateFile将忽略此参数。




















    打开新的加密文件时,该文件从其父目录继承自主访问控制列表。

返回值:
    如果函数成功,则返回值是指定文件,设备,命名管道或邮件插槽的打开句柄。

    如果该函数失败,则返回值为INVALID_HANDLE_VALUE。 要获得扩展的错误信息,请调用GetLastError。

备注:

    CreateFile最初是专门为文件交互而开发的,但后来被扩展和增强,以包括Windows开发人员可用的大多数其他类型的I / O设备和机制。本节试图涵盖开发人员在不同上下文和不同I / O类型中使用CreateFile时可能遇到的各种问题

……未完,还有

 

——————————————2022.08.21——————————————

该博客将停止更新 

新的文章内容和附件工程文件

请到 liwen01 博客首页信息查询

——————————————2022.08.21——————————————

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199174.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:40
下一篇 2026年3月26日 下午1:41


相关推荐

  • matlab中coef是什么,LinearRegression()中的coef_U值代表什么?

    matlab中coef是什么,LinearRegression()中的coef_U值代表什么?我是机器学习的初学者。这只是一个简单的问题,LinearRegression()中的coef帴代表什么?我知道它代表的是系数,但我不明白这些值,高的和正的系数意味着更强的关系吗?在而且,如果coef_u值是指数型的,这是否意味着我的线性回归是错误的?在array([-3.12840684e+02,-1.01279891e+13,-1.42682874e+13,-1.42682874e+13,…

    2025年7月12日
    6
  • Canny边缘检测算法原理及其VC实现详解(一)

    Canny边缘检测算法原理及其VC实现详解(一)图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位,自从1959提出边缘检测以来,经过五十多年的发展,已有许多中不

    2022年5月30日
    44
  • ringbuffer java例子_Java RingBuffer.publish方法代碼示例「建议收藏」

    ringbuffer java例子_Java RingBuffer.publish方法代碼示例「建议收藏」本文整理匯總了Java中com.lmax.disruptor.RingBuffer.publish方法的典型用法代碼示例。如果您正苦於以下問題:JavaRingBuffer.publish方法的具體用法?JavaRingBuffer.publish怎麽用?JavaRingBuffer.publish使用的例子?那麽恭喜您,這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法…

    2025年10月21日
    4
  • httpclient4 请一定设置超时时间

    httpclient4 请一定设置超时时间httpclient4的设置方式和httpclient3有所不同,代码如下:HttpClienthttpclient=newDefaultHttpClient();httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,Config.20000);//连接时间20shttp

    2022年7月22日
    11
  • Linux安装pycharm(照着做就行)[通俗易懂]

    Linux安装pycharm(照着做就行)[通俗易懂]pycharm是Python语言的图形化开发工具。因为如果在Linux环境下的Pythonshell中直接进行编程,其无法保存与修改,在大型项目当中这是很不方便的而pycharm的安装,刚好就解决了这些问题。进入pycharm官网https://www.jetbrains.com/pycharm/download/#section=windows//复制到浏览器的搜索框打开这个网页是这样的在这里选择Linux的社区版,这是免费的,即community你会下载到pychar

    2022年10月19日
    4
  • Linux cpuidle framework(1)_概述和软件架构 — wowo

    Linux cpuidle framework(1)_概述和软件架构 — wowo文章目录 1 前言 2 功能概述 3 软件架构 1 kernelschedu 模块 2 cpuidlecore3 cpuidledrive cpuidlegover 软件流程 1 前言在计算机系统中 CPU 的功能是执行程序 总结起来就是我们在教科书上学到的 取指 译码 执行 那么问题来了 如果没有程序要执行 CPU 要怎么办 也许您会说 停掉就是了啊 确实 是要停掉 但何

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号