内存映射找文件

发布时间:   来源:文档文库   
字号:
OptionExplicit
'VB快速查找大型文件中包含的字符串
PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong
PrivateDeclareFunctionCreateFileLib"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,ByVallpSecurityAttributesAsLong,ByValdwCreationDispositionAsLong,ByValdwFlagsAndAttributesAsLong,ByValhTemplateFileAsLongAsLong
PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLongAsLongPrivateDeclareFunctionGetFileSizeLib"kernel32"(ByValhFileAsLong,lpFileSizeHighAsLongAsLong
PrivateConstGENERIC_READ=&H80000000PrivateConstGENERIC_WRITE=&H40000000PrivateConstOPEN_EXISTING=3PrivateConstFILE_SHARE_READ=&H1PrivateConstFILE_SHARE_WRITE=&H2PrivateConstFILE_ATTRIBUTE_NORMAL=&H80PrivateConstFILE_ATTRIBUTE_ARCHIVE=&H20PrivateConstFILE_ATTRIBUTE_READONLY=&H1PrivateConstFILE_ATTRIBUTE_HIDDEN=&H2PrivateConstFILE_ATTRIBUTE_SYSTEM=&H4

PrivateDeclareFunctionCreateFileMappingLib"kernel32"Alias"CreateFileMappingA"(ByValhFileAsLong,ByVallpFileMappigAttributesAsLong,ByValflProtectAsLong,ByValdwMaximumSizeHighAsLong,ByValdwMaximumSizeLowAsLong,ByVallpNameAsStringAsLong
PrivateDeclareFunctionMapViewOfFileLib"kernel32"(ByValhFileMappingObjectAsLong,ByValdwDesiredAccessAsLong,ByValdwFileOffsetHighAsLong,ByValdwFileOffsetLowAsLong,ByValdwNumberOfBytesToMapAsLongAsLong
PrivateDeclareFunctionUnmapViewOfFileLib"kernel32"(lpBaseAddressAsAnyAsLong
PrivateConstPAGE_READWRITE=&H4PrivateConstFILE_MAP_READ=&H4
PrivateDeclareFunctionVarPtrArrayLib"msvbvm60.dll"Alias"VarPtr"(Ptr(AsAnyAsLong
PrivateTypeSAFEARRAYBOUNDcElementsAsLonglLboundAsLongEndType
PrivateTypeSAFEARRAY1DcDimsAsInteger
fFeaturesAsIntegercbElementsAsLong

clocksAsLong
pvDataAsLong
rgsabound(0AsSAFEARRAYBOUNDEndType
'使用内存映射方式查找大型文件中包含的字符串FunctionFindTextInFile(ByValstrFileNameAsString,ByValstrTextAsStringAsLongDimhFileAsLong,hFileMapAsLong
DimnFileSizeAsLong,lpszFileTextAsLong,pbFileText(AsByteDimppSAAsLong,pSAAsLong
DimtagNewSAAsSAFEARRAY1D,tagOldSAAsSAFEARRAY1D
hFile=CreateFile(strFileName,_
GENERIC_READOrGENERIC_WRITE,_FILE_SHARE_READOrFILE_SHARE_WRITE,_0,_
OPEN_EXISTING,_FILE_ATTRIBUTE_NORMALFILE_ATTRIBUTE_READONLYOr_
Or
FILE_ATTRIBUTE_ARCHIVE
Or
FILE_ATTRIBUTE_HIDDENOrFILE_ATTRIBUTE_SYSTEM,_0'打开文件
IfhFile<>0Then
nFileSize=GetFileSize(hFile,ByVal0&'获得文件大小
hFileMap=CreateFileMapping(hFile,0,PAGE_READWRITE,0,0,vbNullString'创建文件映射对象
lpszFileText=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0'将映射对象映射到进程内部的地址空间

ReDimpbFileText(0'初始化数组
ppSA=VarPtrArray(pbFileText'获得指向SAFEARRAY的指针的指针CopyMemorypSA,ByValppSA,4'获得指向SAFEARRAY的指针
CopyMemorytagOldSA,ByValpSA,Len(tagOldSA'保存原来的SAFEARRAY成员信
CopyMemorytagNewSA,tagOldSA,Len(tagNewSA'复制SAFEARRAY成员信息tagNewSA.rgsabound(0.cElements=nFileSize'修改数组元素个数tagNewSA.pvData=lpszFileText'修改数组数据地址
CopyMemoryByValpSA,tagNewSA,Len(tagNewSA'将映射后的数据地址绑定至数

FindTextInFile=InStr(pbFileText,StrConv(strText,vbFromUnicode'查找子字符串位置

CopyMemoryByValpSA,tagOldSA,Len(tagOldSA'恢复数组的SAFEARRAY结构成员信息

ErasepbFileText'删除数组

UnmapViewOfFilelpszFileText'取消地址映射CloseHandlehFileMap'关闭文件映射对象的句柄EndIf
CloseHandlehFile'关闭文件EndFunctionOptionExplicit
PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong
PrivateDeclareFunctionCreateFileLib"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,ByVallpSecurityAttributesAsLong,ByValdwCreationDispositionAsLong,ByValdwFlagsAndAttributesAsLong,ByValhTemplateFileAsLongAsLong
PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLongAsLongPrivateDeclareFunctionGetFileSizeLib"kernel32"(ByValhFileAsLong,lpFileSizeHighAsLongAsLong
PrivateConstGENERIC_READ=&H80000000PrivateConstGENERIC_WRITE=&H40000000PrivateConstOPEN_EXISTING=3
PrivateConstFILE_SHARE_READ=&H1PrivateConstFILE_SHARE_WRITE=&H2
PrivateConstFILE_ATTRIBUTE_NORMAL=&H80PrivateConstFILE_ATTRIBUTE_ARCHIVE=&H20PrivateConstFILE_ATTRIBUTE_READONLY=&H1PrivateConstFILE_ATTRIBUTE_HIDDEN=&H2
PrivateConstFILE_ATTRIBUTE_SYSTEM=&H4
PrivateDeclareFunctionCreateFileMapping
Lib"kernel32"Alias
"CreateFileMappingA"(ByValhFileAsLong,ByVallpFileMappigAttributesAsLong,ByValflProtectAsLong,ByValdwMaximumSizeHighAsLong,ByValdwMaximumSizeLowAsLong,ByVallpNameAsStringAsLong
PrivateDeclareFunctionMapViewOfFileLib"kernel32"(ByValhFileMappingObjectAsLong,ByValdwDesiredAccessAsLong,ByValdwFileOffsetHighAsLong,ByValdwFileOffsetLowAsLong,ByValdwNumberOfBytesToMapAsLongAsLong
PrivateDeclareFunctionUnmapViewOfFileLib"kernel32"(lpBaseAddressAsAnyAsLong
PrivateConstPAGE_READWRITE=&H4PrivateConstFILE_MAP_READ=&H4
PrivateDeclareFunctionVarPtrArrayLib"msvbvm60.dll"Alias"VarPtr"(Ptr(AsAnyAsLong
PrivateTypeSAFEARRAYBOUND

cElementsAsLonglLboundAsLongEndType
PrivateTypeSAFEARRAY1DcDimsAsIntegerfFeaturesAsIntegercbElementsAsLongclocksAsLongpvDataAsLong
rgsabound(0AsSAFEARRAYBOUNDEndType
'使用内存映射方式查找大型文件中包含的字符串FunctionFindTextInFile(ByValstrFileNameAsString,ByValstrTextAsStringAsLongDimhFileAsLong,hFileMapAsLong
DimnFileSizeAsLong,lpszFileTextAsLong,pbFileText(AsByteDimppSAAsLong,pSAAsLong
DimtagNewSAAsSAFEARRAY1D,tagOldSAAsSAFEARRAY1D
hFile=CreateFile(strFileName,_
GENERIC_READOrGENERIC_WRITE,_
FILE_SHARE_READOrFILE_SHARE_WRITE,_0,_
OPEN_EXISTING,_
FILE_ATTRIBUTE_NORMALOrFILE_ATTRIBUTE_ARCHIVEFILE_ATTRIBUTE_READONLYOr_
FILE_ATTRIBUTE_HIDDENOrFILE_ATTRIBUTE_SYSTEM,_0'打开文件IfhFile<>0Then
nFileSize=GetFileSize(hFile,ByVal0&'获得文件大小
hFileMap=CreateFileMapping(hFile,0,PAGE_READWRITE,0,0,vbNullString'创建文件映射对象
lpszFileText=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0'将映射对象映射到进程内部的地址空间

ReDimpbFileText(0'初始化数组
ppSA=VarPtrArray(pbFileText'获得指向SAFEARRAY的指针的指针
CopyMemorypSA,ByValppSA,4'获得指向SAFEARRAY的指针
CopyMemorytagOldSA,ByValpSA,Len(tagOldSA'保存原来的SAFEARRAY成员信
CopyMemorytagNewSA,tagOldSA,Len(tagNewSA'复制SAFEARRAY成员信息tagNewSA.rgsabound(0.cElements=nFileSize'修改数组元素个数tagNewSA.pvData=lpszFileText'修改数组数据地址
CopyMemoryByValpSA,tagNewSA,Len(tagNewSA'将映射后的数据地址绑定至数
Or



FindTextInFile=InStr(pbFileText,StrConv(strText,vbFromUnicode'查找子字符串位置
CopyMemoryByValpSA,tagOldSA,Len(tagOldSA'恢复数组的SAFEARRAY结构成员信息
ErasepbFileText'删除数组
UnmapViewOfFilelpszFileText'取消地址映射CloseHandlehFileMap'关闭文件映射对象的句柄EndIf
CloseHandlehFile'关闭文件EndFunction
这个函数明显比上一个函数复杂得到,按理说,它运行速度肯定相应的要慢一些,咱们先不下定论,还是经过测试后再说吧,测试代码如下:
调用代码如下:
SubMain(SubMain(
lStartTime=GetTickCount
CallFindTextInFile("G:\Inst\小说\沧海凤歌.txt","打打秋风"'此返回值为字节位置
Debug.PrintGetTickCount-lStartTimeEndSubSubMain(
lStartTime=GetTickCount
CallFindTextInFile("G:\Inst\小说\沧海凤歌.txt","打打秋风"'此返回值为字节位置
Debug.PrintGetTickCount-lStartTimeEndSub

本文来源:https://www.2haoxitong.net/k/doc/18a944d449649b6648d74734.html

《内存映射找文件.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式