【WINAPI】文件指針詳解,SetFilePointerEx設置和查詢文件指針


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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM