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完成端口