Windows核心编程笔记:同步设备I/O与异步设备I/O 200404

04/04工作内容

Windows编程学习

1.设置文件指针位置

调用CreateFile会使系统创建一个文件内核对象来管理对文件的操作。在这个内核对象内部有一个文件指针,它是一个64位偏移量,表示应该在哪里执行下一次同步读取或写入操作。这个文件指针一开始被设为0,因此如果在调用CreateFile之后立即调用ReadFile,那么会从偏移量为0的地方读取文件。

由于每个文件内核对象都有自己的文件指针,因此两次打开同一个文件得到的结果会略有不同。用一个文件对象来对文件进行操作不会影响到其它对象的文件指针。


改变与文件对象相关联的文件指针:

BOOL SetFilePointerEx(
    HANDLE    hFile,
    LARGE_INTERGER    liDistanceToMove,
    PLARGE_INTERGER    pliNewFilePointer,
    DWORD    dwMoveMethod
)

hFile:想要修改哪个文件内核对象的文件指针。

liDistanceToMove:要把指针移动多少字节。系统会把指定的数值与当前值相加,因此使用负数可以将文件指针向后移动。

dwMoveMethodFILE_BEGINFILE_CURRENTFILE_END

pliNewFilePointerSetFilePointerEx更新了文件对象的文件指针之后,会在 pliNewFilePointer参数指向的LARGE_INTERGER 结构中返回文件指针的新植。可以传NULL

注意:

(1)将文件指针的值设为超过文件当前的大小是正当操作。除非是在该位置向文件写入数据或者调用SetEndOfFile,否则这样做不会增加文件在磁盘上的实际大小。

(2)如果操作的文件是用FILE_FLAG_NO_BUFFERING标志打开的,那么文件指针只能被设为扇区大小的整数倍。


2.设置文件尾

SetEndOfFile函数会根据文件对象的文件指针当前所在的位置来截断文件的大小或增大文件的大小。


3.最常用和最方便的对设备数据进行读/写的函数是ReadFileWriteFile

BOOL ReadFile(
    HANDLE    hFile,
    PVOID    pvBuffer,
    DWORD    nNumBytesToRead,
    PDWORD    pdwNumBytes,
    OVERLAPPED*    pOverlapped
);

BOOL WriteFile(
    HANDLE    hFile,
    CONST VOID    *pvBuffer
    DWORD    nNumBytesToWrite,
    PWORD    pdwNumBytes,
    OVERLAPPED*    pOverlapped
);

 

ReadFile只能用于那些用GENERIC_READ标志打开的设备,WriteFile只能用于用GENETIC_WRITE标志打开的设备。


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

BOOL FlushFileBuffers(HANDLE hFile)


5.同步I/O的取消

同步I/O会阻塞住来自同一个线程的任何其它操作


将一个给定线程尚未完成的同步I/O请求取消:

BOOL CancelSynchronousIo(HANDLE hThread);

参数hThread是由于等待同步I/O请求完成而被挂起的线程的句柄。这个句柄必须是用THREAD_TERMINATE访问权限创建的。

Windows核心编程笔记:同步设备I/O与异步设备I/O 200404

上一篇:C#详解值类型和引用类型区别


下一篇:Windows Server 2019 AD活动目录部署(三)备份+恢复