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'