文字版电子书-----请点击这里
overlapped I/O 是Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。
i 激发的文件handles
i 激发的event 对象
i 异步过程调用(Asynchronous Procedure Calls,APCs)
i I/O completion ports
Win32 文件操作函数
Win32 之中有三个基本的函数用来执行I/O,它们是:
iCreateFile()
iReadFile()
iWriteFile()
CreateFile() 可以用来打开各式各样的资源,包括(但不限制于):
i 文件(硬盘、软盘、光盘或其他)
i 串行口和并行口(serial and parallel ports)
iNamed pipes
iConsole
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名称
DWORD dwDesiredAccess, // 存取模式(读或写)
DWORD dwShareMode, // 共享模式(share mode)
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性结构
DWORD dwCreationDisposition, // 如何产生
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 一个临时文件,将拥有全部的属性拷贝
);
其中第6个参数dw FlagsAndAttributes 是使用overlapped I/O 的 关 键。这个参数可以藉由许多个数值组合在一起而完成,其中对于本处讨论最重要的一个数值便是FILE_ FLAG_OVERLAPPED。你可以藉着这个参数,指定使用同步(传统的)调用,或是使用overlapped(异步)调用,但不能够两个都指定。
换句话说,如果这个标记值设立,那么对该文件的每一个操作都将是overlapped。
一个不常被讨论的overlapped I/O 性质是,它可以在同一时间读(或写)文件的许多部分。微妙处在于这些操作都使用相同的文件handle。因此,当你使用overlapped I/O时,没有所谓“目前的文件位置”这样的观念。每一次读或写的操作都必须包含其文件位置。
如果你发出许多个overlapped 请求,那么执行次序无法保证。虽然你在单一磁盘中对文件进行操作时很少会有这样的行为,但如果面对多个磁盘,或不同种类的设备(如网络和磁盘),就常常会看到I/O 请求完全失去次序。
BOOL ReadFile(
HANDLE hFile, // 欲读之文件
LPVOID lpBuffer, // 接收数据之缓冲区
DWORD nNumberOfBytesToRead, // 欲读取的字节个数
LPDWORD lpNumberOfBytesRead, // 实际读取的字节个数的地址
LPOVERLAPPED lpOverlapped // 指针,指向overlapped info
);
BOOL WriteFile(
HANDLE hFile, // 欲写之文件
LPCVOID lpBuffer, // 储存数据之缓冲区
DWORD nNumberOfBytesToWrite, // 欲写入的字节个数
LPDWORD lpNumberOfBytesWritten, // 实际写入的字节个数的地址