1. 文件指针
我们大概已经知道该如何创建或者打开一个文件,用CreateFile函数可以轻松做到,还不了解的小伙伴,请穿越到http://www.cnblogs.com/bigsponge/articles/4936599.html
CreateFile函数会使系统创建一个文件内核对象来管理对文件的操作。在这个内核对象内部有一个文件指针,这是我们今天的主角。
文件指针究竟是什么?
文件指针是一个64位的偏移量,指向文件起始位置的相对的位置,假设文件起始位置的地址为xxxx,文件指针为10,那么指针实际指向的地址是xxxx+10。
文件指针的作用是什么?
当我们要调用ReadFile或WriteFile函数对文件进行读和写操作的时候,读取和写入的起始位置永远在文件指针指向的位置。我们来看看ReadFile函数和WriteFile函数的原型:
ReadFile函数原型:
BOOL ReadFile(
HANDLE hFile,
PVOID pvBuffer,
DWORD nNumBytesToRead,
PDWORD pdwNumBytes,
OVERLAPPED* pOverlapped);
WriteFile函数原型:
BOOL WriteFile(
HANDLE hFile,
CONST VOID *pvBuffer,
DWORD nNumBytesToWrite,
PDWORD pdwNumBytes,
OVERLAPPED* pOverlapped);
hFile 标识要读或者写的文件的句柄
pvBuffer pvBuffer指向一个缓存,调用ReadFile函数时,系统将读出的数据保存在pvBuffer指向的缓存中;调用WriteFile函数时,系统将pvBuffer指向的缓存中存储的数据写入文件
nNumBytesTo* 标识要从设备读出或者写入多少字节的数据
pdwNumBytes 指向一个DWORD变量,函数会将成功从设备读取的字节数和成功写入设备的字节数保存在这个参数中
pOverlapped 标识函数是用同步还是异步的方式完成
可以看到,不管是读还是写,函数中都没有参数用来存放在文件哪个位置读或者写,这个存放位置永远保存在文件指针中。当然,我们可以通过SetFilePointerEx函数来设置文件指针的位置。
当调用CreateFile函数创建文件内核函数时,文件指针被初始化为0,即指向文件起始位置,此时若调用ReadFile函数读取10个字节的数据,文件指针会+10,也就是指向。。。
2. 用SetFilePointerEx()设置文件指针的位置:
函数原型:
BOOL SetFilePointerEx(
HANDLE hFile,
LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER pliNewFilePointer,
DWORD dwMoveMethod);
hFile 我们想要修改哪个文件内核对象的文件指针
liDistanceToMove 标识文件指针要移动多少个字节
pliNewFilePointer 系统会在pliNewFilePointer参数指向的LARGE_INTEGER结构体中保存文件指针的新值
dwMoveMethod 标识移动文件指针的方式,有三个值可以选择:FILE_BEGIN 标识文件指针的起始位置为文件首,
可以传给SetFilePointerEx的dwMoveMethod参数的值
值 含义
FILE_BEGIN 文件指针起始位置为文件起始位置,当调用SetFilePointerEx成功后,文件指针将指向liDistanceToMove指向的位置。
FILE_CURRENT 文件指针起始位置为当前文件指针指向的位置
FILE_END 文件指针起始位置为文件末尾
3. 用SetFilePointerEx()查询文件指针的位置:
Windows并没有提供一个可以查询文件指针的GetFilePointerEx函数,但我们可以调用SetFilePointerEx()函数,将liDistanceToMove设为0来达到相同的效果,代码如下:
1 LARGE_INTEGER liCurrentPosition;2 liCurrentPosition.QuadPart = 0;3 SetFilePointerEx(hFile, liCurrentPosition, &liCurrentPosition, FILE_CURRENT);