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 標識文件指針的起始位置為文件首,
值 | 含義 |
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);