win32 CreateFile

CreateFile函数详解
本文详细介绍了Windows API中的CreateFile函数,该函数用于创建或打开文件及I/O设备。文章解释了函数的各个参数,包括文件名、访问模式、共享模式等,并提供了不同应用场景的例子。

1 参考资料:

msdn:

函数定义
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

例子:Opening a File for Reading or Writing
https://msdn.microsoft.com/en-us/library/windows/desktop/bb540534(v=vs.85).aspx
例子:串口 Configuring a Communications Resource
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363201(v=vs.85).aspx
例子: 监控串口事件 Monitoring Communications Events
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363424(v=vs.85).aspx

《windows高级编程指南》第15章 设备I/O 重点

2 函数介绍

创建或者打开一个文件或者I/O设备.
通用的I/O设备,包括下面这些:
文件
文件流
目录
物理盘
volume 磁盘卷 逻辑盘
控制台缓冲区
磁带驱动器,
通信资源 串行口 和并行口 应该包括USB 口吧
邮槽和管道

根据所访问对象以及所指定访问特性标识的不同,该函数会返回一个用于访问所指定对象的句柄

3 函数原型
HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,    // 设备名称
  _In_     DWORD                 dwDesiredAccess, // 读还是写
  _In_     DWORD                 dwShareMode,     // 对文件的访问独占
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, //可以传NULL
  _In_     DWORD                 dwCreationDisposition, //创建或者打开文件的方式
  _In_     DWORD                 dwFlagsAndAttributes,  //
  _In_opt_ HANDLE                hTemplateFile          // 可以为NULL
);
4 参数解析
lpFileName

设备名称 指向文件名的指针

dwDesiredAccess
  • 0 不想读写设备数据,只想改变设备的配置—-如文件的时间戳—-应传递0
  • GENERIC_READ 只读访问
  • GENERIC_WRITE 只写访问 用于向打印机传递数据或者备份软件
  • GENERIC_READ | GENERIC_WRITE 允许对设备的读写
dwShareMode
  • 0 阻止其他进程打开文件,当该进程想要删除,读或者写访问该文件
  • FILE_SHARE_DELETE
  • FILE_SHARE_READ
  • FILE_SHARE_WRITE
lpSecurityAttributes 指向安全属性的指针

可以为NULL

dwCreationDisposition

当文件 存在 或不存在 ,该函数的默认行为

  • CREATE_ALWAYS
    如果指定的文件存在并且是可写的,函数会覆盖该文件,
    函数成功返回,最后的last-error code 设置为ERROR_ALREADY_EXISTS(183)
    如果指定的文件不存在,但是是一个有效的路径,会创建新的文件,
    函数成功返回,last-error code为 0

  • CREATE_NEW
    创建一个新的文件,需要这个文件不存在
    如果文件存在,函数失败,返回 ERROR_FILE_EXISTS (80).
    如果文件不存在,但是是一个有效的可写的路径位置,会创建一个新的文件

  • OPEN_ALWAYS
    打开一个文件,
    如果文件存在,函数正确返回,ERROR_ALREADY_EXISTS (183).
    如果不存在,创建一个文件,并且返回0
  • OPEN_EXISTING
    如果文件存在 就打开
    如果文件不存在,函数失败,返回ERROR_FILE_NOT_FOUND(2)
  • TRUNCATE_EXISTING
    打开一个已经存在的文件,并将其大小设置为0
    如果文件不存在,则失败,GENERIC_WRITE标志必须同该标志一起使用。
dwFlagsAndAttributes 文件属性和标志

可以为0,一般的普遍的默认值是FILE_ATTRIBUTE_NORMAL ,这个一般是单独使用
有两个作用:它允许微调同设备的通信,如果设备是文件,还能设置文件的属性。
大多数的标志告诉系统你打算如何访问设备。系统可以优化它的缓冲算法来帮助程序工作得更有效

其中的一个标志是 FILE_FLAG_OVERLAPPED ,告诉系统,你想要异步的访问一个设备。
打开设备的缺省方式是同步I/O(不指定FILE_FLAG_OVERLAPPED)。阻塞的写 和读。
因为设备I/O同大多数其他操作相比较缓慢,你可能会想要异步通信某些设备。
简单的说是,你调用一个函数告诉操作系统去读写数据,但是不必要等到I/O结束。
你的调用立即返回。操作系统使用它的线程,为你完成I/O。
当操作系统完成了你请求的I/O的时候,你会得到通知。
异步I/O是设计应该用程序时,一种很方便的方法。

hTemplateFile

标识一个打开的句柄或者为NULL

<think>嗯,用户想了解在使用win32file.CreateFile时如何指定管道名称,需要给出示例。首先,我需要回忆一下Windows中命名管道的相关知识。命名管道的名称格式应该是\\.\pipe\后面跟具体的管道名,对吧?比如\\.\pipe\MyPipe。 接下来,用户可能在使用Python的win32file模块,所以需要确认CreateFile函数的参数。在PyWin32库中,CreateFile的参数和Windows API的CreateFile函数类似。要打开命名管道,需要指定正确的访问权限,比如GENERIC_READ或GENERIC_WRITE,或者两者都有。同时,需要设置共享模式,可能使用FILE_SHARE_READ | FILE_SHARE_WRITE。打开方式应该是OPEN_EXISTING,因为管道需要先由服务器创建,客户端才能连接。另外,可能需要设置安全属性,但Python中可以传None。还有标志位,比如FILE_FLAG_OVERLAPPED,但如果是同步操作的话可能不需要,这里用户可能只需要基本示例,所以可以先忽略。 然后,构造一个示例代码。首先需要导入win32file和pywintypes。客户端代码部分,管道名称用\\\\.\\pipe\\MyPipe,注意在Python字符串中反斜杠需要转义。然后调用CreateFile,参数包括管道名称、访问模式、共享模式、None(安全属性)、OPEN_EXISTING、0(属性)、None(模板文件)。之后可以用ReadFile或WriteFile进行通信。但要注意,客户端和服务器端的代码需要配合使用,所以可能需要提供服务器端的示例,这样用户才能测试。 另外,引用中的资料提到CreateFile用于管道等设备,所以需要确认是否正确。引用[2]提到CreateFile可以操作管道,所以应该没问题。用户可能需要了解完整的流程,包括服务器端创建管道和客户端连接。因此,示例中应该包含服务器端使用CreateNamedPipe和客户端使用CreateFile的部分。 可能的问题点:是否正确处理转义字符,管道名称的格式是否正确,访问权限是否正确设置,以及错误处理。比如,如果服务器端没有先创建管道,客户端调用CreateFile会失败,所以需要提醒用户先启动服务器端。 最后,生成相关问题,可能涉及错误处理、异步操作、数据读写方式等,确保用户能进一步探索。</think>在Windows API中使用命名管道时,管道名称的格式为`\\.\pipe\<管道名称>`。以下是使用`win32file.CreateFile`连接命名管道的具体实现步骤和示例代码: ### 实现步骤 1. **管道名称规范**:采用`\\.\pipe\<自定义名称>`格式 2. **访问权限设置**:通常需要组合`GENERIC_READ`和`GENERIC_WRITE` 3. **共享模式**:推荐使用`FILE_SHARE_READ | FILE_SHARE_WRITE` 4. **创建标志**:必须使用`OPEN_EXISTING`,因为管道需先由服务端创建 ### 客户端连接示例代码 ```python import win32file import pywintypes try: # 连接命名管道 pipe_name = r'\\.\pipe\MyTestPipe' handle = win32file.CreateFile( pipe_name, win32file.GENERIC_READ | win32file.GENERIC_WRITE, win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, 0, None ) # 写入数据示例 message = "Hello Pipe!".encode('utf-8') win32file.WriteFile(handle, message) # 读取数据示例 result, data = win32file.ReadFile(handle, 4096) print("Received:", data.decode('utf-8')) except pywintypes.error as e: print(f"操作失败 (错误代码 {e.winerror}): {e.strerror}") ``` ### 服务端创建管道代码 ```python import win32pipe # 创建命名管道 pipe = win32pipe.CreateNamedPipe( r'\\.\pipe\MyTestPipe', win32pipe.PIPE_ACCESS_DUPLEX, win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT, win32pipe.PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, None ) print("等待客户端连接...") win32pipe.ConnectNamedPipe(pipe, None) ``` ### 关键技术点 1. 管道名称必须与服务端创建的完全匹配 2. `OPEN_EXISTING`参数确保连接已存在的管道[^2] 3. `FILE_SHARE`设置允许多进程并发访问 4. 建议使用消息模式(`PIPE_TYPE_MESSAGE`)保证数据完整性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值