文件指针

来源:互联网 发布:java中do while的用法 编辑:程序博客网 时间:2024/05/22 02:51

一.移动文件指针
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,stdcalloption casemap:none;--------------------------------------------------------------------------------;头文件与库文件导入include windows.incinclude kernel32.incinclude user32.incincludelib kernel32.libincludelib user32.libLmacro@var:VARARGLOCAL@lbl.const@lbldb@var,0.codeexitm<offset @lbl>endm;--------------------------------------------------------------------------------;函数定义;--------------------------------------------------------------------------------;等值替换定义;--------------------------------------------------------------------------------;宏定义;--------------------------------------------------------------------------------;包含文件;--------------------------------------------------------------------------------;已初始化数据段.datadwDistanceLowdd1024 * 1024;--------------------------------------------------------------------------------;未初始化数据段.data?hFiledd?dwBytesdd?;--------------------------------------------------------------------------------;常量段.constszStringdb"0123456789",0;--------------------------------------------------------------------------------;代码段.codestart:invokeCreateFile,L("test.dat"),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL.ifeax == INVALID_HANDLE_VALUEinvokeMessageBox,NULL,L("Create Files Fails"),L("Error"),MB_OKjmp@F.endifmovhFile,eaxinvokeSetFilePointer,hFile,1024,NULL,FILE_CURRENT.ifeax != NULLinvokeMessageBox,NULL,L("Success"),L("Success"),MB_OK.endifinvokeWriteFile,hFile,addr szString,sizeof szString,addr dwBytes,NULLinvokeSetEndOfFile,hFileinvokeCloseHandle,hFile@@:invokeExitProcess,NULL;--------------------------------------------------------------------------------end start  ;函数入口地址

 

 

 

如果文件大小为1kb   那么Size On Disk 就为4kb   因为在我的电脑上  磁盘对齐粒度是4kb