[讨论]关于读取文件内容问题
目前我知道读取文件内容的方法有两种:一是先打开文件,然后ReadFile,读取内容,然后比较
具体的的流程是CreateFile---SetFilePointer---ReadFile---lstrcmp
二是内存影射文件直接在内存中比较
具体的的流程是CreateFile--GetFileSize--CreateFileMapping--MapViewOfFile,这里返回一个句柄,然后ReadFile来读,接着用lstrcmp对比是否发现.
具体例子:
一个文件的内容是:
醒时饮酒醉时歌
诸君碌碌我蹉跎
牛衣空负眉头白
酒中不胜是呤哦
青蚨血尽无长物
心魔原来是酒魔
将进酒,将进酒
席上无歌方劝酒
无酒无歌且奈何
我现在想读取这个文件里,是否发现 “心魔原来是酒魔”这句诗.下面看看我写的代码错哪了?
[code]
szLogFile db "C:\test.txt",0
lpBuffer db '心魔原来是酒魔',0
sz1 db '成功找到!',0
x_str db 256 dup(0)
.data?
hFile dd ?
_File proc
local x_strlen: DWORD
invoke CreateFile, addr szLogFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
invoke SetFilePointer,hFile,0,0,FILE_BEGIN ;设定指针
invoke ReadFile ,hFile, addr x_str ,8, addr x_strlen , NULL ;读取文件
invoke lstrcmp , addr x_str,addr lpBuffer ;对比是否发现指定诗句
.if eax != NULL
invoke MessageBox,NULL,addr sz1,NULL,MB_OK ;如果符合,就处理
.
.
_File endp
[/code]
第二种在内存中读取的代码:
[code]
.data
FileName db "C:\test.txt",0
lpBuffer db '心魔原来是酒魔',0
sz1 db '成功找到!',0
.code
start:
_ifile proc
local @hFile,@dwFileSize,@hMapFile,@lpMemory
invoke CreateFile,addr FileName,GENERIC_READ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke GetFileSize,eax,NULL
mov @dwFileSize,eax
.if eax
invoke CreateFileMapping,@hFile,\
NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
invoke MapViewOfFile,eax,\
FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax ;返回的句柄应该怎么处理?
.
.
invoke lstrcmp,addr lpBuffer.......这里貌似返回一个变量才能比较
[/code] 第一种:
invoke ReadFile ,hFile, addr x_str ,8, addr x_strlen , NULL ;读取文件
读取的是8个字节,而汉字一个字是2字节
invoke lstrcmp , addr x_str,addr lpBuffer ;对比是否发现指定诗句
.if eax != NULL
返回的是大于小于和等于不是NULL
小弟初学Win32,有错还请指正 汗,这么老的帖子都翻出来
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
szFile db "C:\test.txt",0
szName db "心魔原来是酒魔",0
sz1 db "Find OK",0
.data?
@hFile dd ?
@dwFileSize dd ?
@hMapFile dd ?
@lpMemory dd ?
.code
start:
invoke CreateFile,addr szFile,GENERIC_READ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
.endif
invoke GetFileSize,eax,NULL
mov @dwFileSize,eax
.if eax
invoke CreateFileMapping,@hFile,\
NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
.endif
invoke MapViewOfFile,eax,\
FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax
.endif
.endif
mov ecx, @dwFileSize
sub ecx,13
mov esi, @lpMemory
@@:
mov edi, offset szName
push ecx
push esi
mov ecx,14
repe cmpsb
pop esi
pop ecx
je @f
inc esi
loop @b
@@:
.if ecx != 0
invoke MessageBox,NULL,addr sz1,NULL,MB_OK
.endif
invoke UnmapViewOfFile,@lpMemory
invoke CloseHandle,@hMapFile
invoke CloseHandle,@hFile
invoke ExitProcess,NULL
end start
页:
[1]