文件指针

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值