| 站点地图 | 联系我
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | 书签 | ASP.Net书签 | 上善若水 厚德载物
 现在位置 :: 主页 >> 资料中心 >> ROOT / CODE / ASM/ASM32 /
 

Win32汇编——文件操作

来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/kisbuddy/article/details/6686653

Win32汇编——文件操作

标签: 汇编扩展windowsunixbytenull

2011-08-14 20:31 2225人阅读 评论(0) 收藏 举报

分类: Win32 汇编(罗云彬 第3版)(14)

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、创建和读写文件

打开、创建文件:CreateFile (文件名需全路径)

关闭: CloseHandle

调整文件指针: SetFilePointer

无GetFilePointer函数,可通过

invoke  SetFilePointer,hFile,0,NULL,FILE_CURRENT  


获得当前的文件指针。

设置文件结尾:SetEndOfFile

有截断文件和扩充文件的功能。常与SetFilePointer 配合。

读文件: ReadFile

写文件: WriteFile

(读写两函数可以是同步的也可以是异步的,读写的扩展函数EX只能用于异步读写文件)

强制清空数据缓冲区:FlushFileBuffers

加解锁:LockFile UnlockFile

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
; FormatText.asm  
; 文件读写例子 —— 将 Unix 格式的文本文件(以0ah换行)转换成 PC 格式  
; 的文本文件(以0dh,0ah换行),读写文件操作使用文件操作函数。  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
;重要部分:  
;********************************************************************  
; 循环读出文件并处理每个字节  
;********************************************************************  
	xor eax,eax  
	mov @dwBytesRead,eax  
	.while  TRUE  
		invoke  ReadFile,@hFile,addr @szReadBuffer,sizeof @szReadBuffer,addr @dwBytesRead,NULL  
		.break  .if ! @dwBytesRead  
		invoke  _FormatText,addr @szReadBuffer,@dwBytesRead,@hFileNew  
	.endw  

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
; 子程序:在缓冲区中找出一行数据,处理换行并保存  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
_FormatText	proc	uses esi _lpData,_dwSize,_hFile  
	local	@szBuffer[128]:byte,@dwBytesWrite  

	mov	esi,_lpData  
	mov	ecx,_dwSize  
	lea	edi,@szBuffer   ;目的缓冲区,esx+edi   
	xor	edx,edx  
	cld  
_LoopBegin:  
	or	ecx,ecx  
	jz	_WriteLine  
	lodsb  
	dec	ecx  
	cmp	al,0dh      ;遇到0dh则丢弃  
	jz	_LoopBegin  
	cmp	al,0ah      ;遇到0ah则扩展为0dh,0ah  
	jz	_LineEnd  
	stosb  
	inc	edx  
	cmp	edx,sizeof @szBuffer-2  
	jae	_WriteLine  ;行缓冲区满则保存  
	jmp	_LoopBegin  
_LineEnd:  
	mov	ax,0a0dh  
	stosw  
	inc	edx  
	inc	edx  
_WriteLine:  
	push	ecx  ;WriteFile函数内部使用ecx循环  
	.if edx  
		invoke	WriteFile,_hFile,addr @szBuffer,edx,addr @dwBytesWrite,NULL  
	.endif  
	lea	edi,@szBuffer  
	xor	edx,edx  
	pop	ecx  
	or	ecx,ecx  
	jnz	_LoopBegin  
	ret  
  
_FormatText endp  


二、查找文件

通用结构:

invoke	FindFirstFile,lpFindFile,lpFindFileData  
.if eax !=  INVALID_HANDLE_VALUE  
	mov hFindFile,eax  
	.repeat  
		;处理文件  
		invoke	FindNextFile,hFindFile,lpFindFileData  
	.until  eax ==  FALSE  
	invoke	FindClose,hFindFile  
.endif  


lpFindFileData 指向WIN32_FIND_DATA,该结构中cFileName字段只返回文件名,不包含路径信息。

三、一些文件操作函数

获取文件类型:GetFileType

获取文件长度:GetFileSize

获取文件时间:GetFileTime (存于FILETIME结构)

修改文件时间:SetFileTime

文件时间格式转为系统时间格式:FIleTimeToSystemTime

系统时间格式转为文件时间格式:SystemTimeToFileTime

修改文件属性:SetFileAttributes (不需要打开文件,只需指定全路径的文件名即可)

获取文件属性:GetFileAttributes

拷贝文件:CopyFile,CopyFileEx (CopyFileEx可指定回调函数对数据进行处理,如显示进度等,适合大型文件的拷贝)

移动文件:MoveFile、MoveFileEx (MoveFileEx可以实现让系统在下次启动时删除指定文件)

删除文件:DeleteFile (关闭的文件才能删除)

四、驱动器和目录

创建、修改、删除卷标:SetVolumeLabel

逻辑驱动器检测:GetLogicalDrives:无输入参数,返回值0~25位分别代表A~Z盘符

GetLogicaDriveStrings:返回所有盘符组成的字符串,以0间隔

检测驱动器类型:GetDriveType

获取逻辑驱动器更多属性:GetVolumeInformation

检测逻辑驱动器剩余空间:GetDiskFreeSpace

创建和删除目录:CreateDirectory、RemoveDirectory (诸多注意 P371)

获取和修改当前目录:GetCurrentDirectory、SetCurrentDirectory

获取临时目录:GetTempPath

获取Windows目录:GetWindowsDirectory

获取系统目录:GetSystemDirectory

Link: http://www.asm32.net/article_details.aspx?id=7205


浏览次数 0 发布时间 2017/5/16 2:00:49 从属分类 ASM/ASM32 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | 书签 | ASP.Net书签 | 京ICP备09029108号-1