一.移動文件指針
SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod
dwMoveMethod 指明移動的模式
FILE_BEGIN??????? 不管文件處于什么地方,總是從文件的頭部開始移動,這時的位置參數相當于指定了一個絕對位置
FILE_CURRENT?? 從當前的文件指針處開始移動,這時的位置參數相當于指定了一個相對位置
FILE_END?????????? 從文件尾開始移動,如果要從文件尾往回移動一段距離,那么位置參數就應該指定為負數
Win32文件操作函數可以支持很多對象,有些對象并不支持文件指針,對他們就不能使用SetFilePointer函數
既然文件指針可以設置,那么如何獲取當前的文件指針呢?
實際上 并沒有一個專用的函數可以完成這個功能,,但是我們可以巧妙的利用SetFilePointer來獲取當前的文件指針
invoke SetFilePointer,hFile,0,NULL,FILE_CURRENT
實際上文件并沒有移動,所以返回值就是當前的文件指針
二.文件分割
文件指針可以移動到文件所有數據的后面,比如,現在文件的長度是100B,但是還是可以把文件指針的數據移動到1000B的位置,這樣的操作有什么用處呢?用途是可以將文件擴展到需要的長度,,接著在用WriteFile寫入數據,就是從1000B的地方開始寫入.
使用SetEndOfFile函數也可以擴展文件長度,SetEndOfFile總是將文件的長度調整到當前文件指針指向的長度,,所以這個函數還有截斷文件的功能,當文件指針位于文件文件中間的時候,函數將文件指針后面的內容截斷,當文件指針位于文件尾以后的位置,函數將文件長度擴展.
invoke SetEndOfFile,hFile
當文件被擴展的時候,被擴展部分的內容是不確定的(MSDN說的,試驗的結果好像這部分總是0)
?
?
;--------------------------------------------------------------------------------
;程序環境設置
.386
.model flat,stdcall
option casemap:none
;--------------------------------------------------------------------------------
;頭文件與庫文件導入
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
L macro @var:VARARG
LOCAL @lbl
.const
@lbl db @var,0
.code
exitm <offset @lbl>
endm
;--------------------------------------------------------------------------------
;函數定義
;--------------------------------------------------------------------------------
;等值替換定義
;--------------------------------------------------------------------------------
;宏定義
;--------------------------------------------------------------------------------
;包含文件
;--------------------------------------------------------------------------------
;已初始化數據段
.data
dwDistanceLow dd 1024 * 1024
;--------------------------------------------------------------------------------
;未初始化數據段
.data?
hFile dd ?
dwBytes dd ?
;--------------------------------------------------------------------------------
;常量段
.const
szString db "0123456789",0
;--------------------------------------------------------------------------------
;代碼段
.code
start:
invoke CreateFile,L("test.dat"),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,NULL,L("Create Files Fails"),L("Error"),MB_OK
jmp @F
.endif
mov hFile,eax
invoke SetFilePointer,hFile,1024,NULL,FILE_CURRENT
.if eax != NULL
invoke MessageBox,NULL,L("Success"),L("Success"),MB_OK
.endif
invoke WriteFile,hFile,addr szString,sizeof szString,addr dwBytes,NULL
invoke SetEndOfFile,hFile
invoke CloseHandle,hFile
@@:
invoke ExitProcess,NULL
;--------------------------------------------------------------------------------
end start ;函數入口地址
?
?
?
如果文件大小為1kb?? 那么Size On Disk 就為4kb?? 因為在我的電腦上? 磁盤對齊粒度是4kb
?