Windows 设备io

CreateFile

可打开或创建文件或者I/O设备,并返回可访问的句柄

HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名

DWORD dwDesiredAccess, //访问模式(写/读)

DWORD dwShareMode, //共享模式

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针

DWORD dwCreationDisposition, //如何创建

DWORD dwFlagsAndAttributes, //文件属性

HANDLE hTemplateFile //用于复制文件句柄

);

Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS。

注意:

dwFlagsAndAttributes的参数为FILE_FLAG_OVERLAPPED  ,表示是异步io.因为默认是同步io的。

 FILE_FLAG_OVERLAPPED  
      指示系统初始化对象 , 此操作将对进程设置一个引用计数并返回 ERROR_IO_PENDING.
      处理完成后 , 指定对象将被设置为信号状态 .
      当你指定 FILE_FLAG_OVERLAPPED 时 , 读写文件的函数必须指定一个 OVERLAPPED 结构 .
      并且 . 当 FILE_FLAG_OVERLAPPED 被指定 , 程序必须执行重叠参数 ( 指向 OVERLAPPED
      结构 ) 去进行文件的读写 .
      这个标志也可以有超过一个操作去执行 .

GetFileSizeEx

获取文件的大小

BOOL GetFileSizeEx(

  HANDLE         hFile,

  PLARGE_INTEGER lpFileSize

);

SetFilePointerEx()

设置文件指针的位置:

BOOL SetFilePointerEx(
HANDLE hFile,
LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER pliNewFilePointer,
DWORD dwMoveMethod);

liDistanceToMove  标识文件指针要移动多少个字节
pliNewFilePointer  系统会在pliNewFilePointer参数指向的LARGE_INTEGER结构体中保存文件指针的新值
dwMoveMethod  标识移动文件指针的方式,有三个值可以选择:FILE_BEGIN 标识文件指针的起始位置为文件首,
可以传给SetFilePointerEx的dwMoveMethod参数的值
值 含义
FILE_BEGIN 文件指针起始位置为文件起始位置,当调用SetFilePointerEx成功后,文件指针将指向liDistanceToMove指向的位置。
FILE_CURRENT 文件指针起始位置为当前文件指针指向的位置
FILE_END 文件指针起始位置为文件末尾
 

SetEndOfFile

针对一个打开的文件,将当前文件位置设为文件末尾.一般可以考虑和SetFilePointerEx一起使用。

 BOOL SetEndOfFile(
  [in] HANDLE hFile
);

ReadFile

从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作, 如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。

 BOOL ReadFile(
    HANDLE hFile,            //文件的句柄
    LPVOID lpBuffer,          //用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToRead,    //要读入的字节数
    LPDWORD lpNumberOfBytesRead,    //指向实际读取字节数的指针
    LPOVERLAPPED lpOverlapped
    //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。 
    //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

FILE_FLAG_OVERLAPPED 
文件或设备被打开或创建异步I / O。
 当后续的I / O操作完成这个句柄,OVERLAPPED结构中指定的事件 将被设置为有信号状态。 
 如果这个标志被指定,该文件可用于同时读取和写入操作。
 如果没有指定这个标志,然后被序列化I / O操作,即使调用读写函数指定一个OVERLAPPED结构。

调用成功,返回非0;调用不成功,返回为0。会设置GetLastError。
如启动的是一次异步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。
如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早已抵达了文件的结尾。

WriteFile

BOOL WriteFile(
HANDLE  hFile,//文件句柄
LPCVOID lpBuffer,//数据缓存区指针
DWORD   nNumberOfBytesToWrite,//你要写的字节数
LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针
);

文件指针指向的位置开始将数据写入到一个文件中, 且支持同步和异步操作。解释和ReadFile一样

FlushFileBuffers

强制系统将缓存数据写入到设备。

BOOL  FlushFileBuffers(

    __in HANDLE hFile

    );

异步IO操作

typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED

注意事项:

1.设备驱动程序不必以先入先出的方式处理队列IO请求。

2.如何用正确的方式来检查错误。

如果请求的IO是异步操作,调用readFile 和 writeFile 发送错误时,返回FALSE,必须调用GetLastError来检查,如果GetLastError返回的是ERR_IO_PENDING,那么io请求已经添加到队列,会晚些时间完成。如果不是ERR_IO_PENDING,那么io请求无法添加到设备队列。

3.在异步IO请求完成之前,一定不能移动或销毁在发出IO请求所使用的数据缓存和OVERLAPPED结构。也就是说不要把这些用到的变量定义为局部变量。

取消IO请求

1.CancleIO 

已成功请求指定文件句柄的调用线程发出的所有挂起 I/O 操作的取消操作

BOOL WINAPI CancelIo(
  _In_ HANDLE hFile
);

CancelIoEx

标记指定文件句柄的任何未完成 I/O 操作。 该函数仅取消当前进程中的 I/O 操作,而不管哪个线程创建了 I/O 操作

BOOL WINAPI CancelIoEx(
  _In_     HANDLE       hFile,
  _In_opt_ LPOVERLAPPED lpOverlapped
);

接收io请求完成通知

 使用触发事件内核对象的办法例子:

 使用io完成端口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值