Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Function FindAndReplace(ByVal sFilename As String, ByVal sFindText As String, ByVal sReplaceText As String, Optional ByVal lStartPos As Long = 1) As Long
Dim abFindText() As Byte, abReplaceText() As Byte
abFindText = sFindText
abReplaceText = sReplaceText
FindAndReplace = FindAndReplaceB(sFilename, abFindText(), abReplaceText(), lStartPos)
End Function
Function FindAndReplaceB(ByVal sFilename As String, abFindText() As Byte, abReplaceText() As Byte, Optional ByVal lStartPos As Long = 1) As Long
On Error Resume Next
Dim abTempFileBuffer() As Byte, abFileBuffer() As Byte
Dim lFindTextLen As Long, lReplaceTextLen As Long, lFileLen As Long
Dim lFreeFile As Long
FindAndReplaceB = -1
lFindTextLen = UBound(abFindText) + 1
lReplaceTextLen = UBound(abReplaceText) + 1
lFreeFile = FreeFile
Open sFilename For Binary As lFreeFile
lFileLen = LOF(lFreeFile)
If lFileLen > 0 Then
ReDim abTempFileBuffer(lFileLen - 1)
Get lFreeFile, , abTempFileBuffer
ReDim abFileBuffer(lFileLen + (lReplaceTextLen - lFindTextLen) - 1)
End If
Close lFreeFile
If Err.Number <> 0 Or FileLen = 0 Then Exit Function
FindAndReplaceB = InStrB(lStartPos, abTempFileBuffer, abFindText, vbBinaryCompare)
If FindAndReplaceB > 0 Then
If FindAndReplaceB > 1 Then
CopyMemory abFileBuffer(0), abTempFileBuffer(0), FindAndReplaceB - 1
End If
lFreeFile = FreeFile
Kill sFilename
Open sFilename For Binary As lFreeFile
Put lFreeFile, 1, abFileBuffer
Close lFreeFile
End If
End Function
Private Sub Form_Load()
'Open "c:\testfsd.txt" For Binary As #1
'Dim b() As Byte
'b = String$(12, 11) & "2005年6月" & vbTab
'Put #1, , b
'Close #1
Debug.Print "替换位置在:"; FindAndReplace("c:\testfsd.txt", "2005年6月", "2005年12月")
End Sub