一.移动文件指针
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