#E6E6E6 【VB】Text MultiReplace:多檔案文字搜尋與取代 作者:吳文成

[[img src=computer/TextMultiReplace.gif height=459 width=362 align=left]]  其實有點納悶,因為我找翻了軟體王等等的軟體網站,卻找不到符合自己需要的「多檔案文字搜尋與取代」軟體。我試用了老外寫的這類程式,但是功能不支援多行文字的搜尋與取代,而且對於中文字的支援奇差。我也試用了中國網友寫的這類程式,功能還不錯
,只可惜介面是簡體的,出現的亂碼可能會讓我的近視加重!

  看來必須要自己撰寫這類的程式。我需要的功能是,對於指定目錄下的檔案,可以針對其檔案內容
,來進行特定文字的全域性的(也就是盡可能的)搜尋與取代。搜尋與取代的特定文字不但能夠區分英文大小寫與支援中文字碼,並且也允許有斷行符號(也就是多行文字)。另一方面,檔案來源除了是指定目錄下的檔案之外,我也希望能夠針對特別選定的檔案來作處理。所以使用者可以利用物件拖放的方式,從檔案總管拖曳你所需要處理的檔案到右邊的列表,也可以利用開啟清單檔的方式,來將檔案名單加入列表之中。在這裡,使用者能夠在列表裡[[img src=computer/TextMultiReplace1.gif height=399 width=346 align=right]]編輯檔案清單,同時能夠開啟或檢視所選取的個別檔案。

  在執行多檔案的搜尋與取代之後,我們還需要把處理結果用列表顯示出來。於是上述的列表再度派上用場,這個列表不但可以作為檔案來源的清單,也可以在執行多檔案的搜尋與取代之後,標示出哪些檔案是被確認搜尋與取代(例如列表裡被核選的項目),而哪些檔案是不符合條件而未被處理(例如列表裡沒有被核選的項目)——最後
,我們可以另外儲存這些結果作為紀錄。所以這個列表同時扮演資料輸入、輸出與整合的角色。

   「 多檔案文字搜尋與取代 」軟體 Text MultiReplace 是用 Visual Basic 撰寫的 ,執行檔相當小巧只有 30 幾 Kbyte 而已 。在程式碼編寫方面,設計這類的程式,除了前面幾段提到的整體性的功能界定與規劃之外,還需要解決幾個細節問題,包括有:如何作出包含子目錄的檔案搜尋,如何判定檔案的屬性(隱藏檔、唯讀檔或系統檔),如何對檔案做輸入/輸出處理(讀取檔案全文與重寫檔案),如何根據給定條件來對目標資料作全域性的文字搜尋與取代。其他零碎的問題例如是,如何做出列表選單裡「開啟個別檔案」、「檢視個別檔案」與「瀏覽所在目錄」的功能。對於有經驗的程式設計者來說,以上這些都是經常碰到而不成問題的問題,所以在幾天之內就可以完成這類程式,如果想要發行這個程式的話,多餘的時間[[img src=computer/TextMultiReplace2.gif height=159 width=330 align=right]]還可以想想怎樣編寫一個漂亮的版權說明。

  好了,在自吹自擂之後,按照慣例,我也要貢獻幾段程式碼,給對於程式設計有興趣的人。部分程式函數列舉於下:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const forReading = 1, forWriting = 2, forAppending = 3
Private fs, f

Private Sub Form_Load()
 ' fs 表示 FileSystemObject 物件
 Set fs = CreateObject("Scripting.FileSystemObject")
End Sub

' 包含子目錄的檔案搜尋
' 參數 inPath 表示起始目錄,參數 Filter 表示檔案過濾條件,例如字串 "*.txt;*.htm;*.html"
' 選擇性參數 Include_SubDir 決定是否要搜尋子目錄,預設為否

Private Sub searchFile(inPath As String, Filter As String, Optional Include_SubDir As Boolean)
 On Error Resume Next
  
 Dim fn As String, pfn As String, i As Long, isFind As Boolean
 Dim dirList() As String, nDir As Long, filterList() As String
  
 filterList = Split(Filter, ";")
 fn = Dir(inPath, vbHidden Or vbDirectory Or vbReadOnly)

 Do While fn <> ""
  If fn <> "." And fn <> ".." Then
   pfn = inPath & fn
   If fs.FolderExists(pfn) Then
    If Include_SubDir Then
     nDir = nDir + 1
     ReDim Preserve dirList(nDir)
     dirList(nDir) = pfn
    End If
   Else
    isFind = False
    For i = 0 To UBound(filterList)
     If UCase(fn) Like UCase(filterList(i)) Then isFind = True: Exit For
    Next i
    If isFind Then
     '====================
     ' 針對找到的檔案執行處理程序
     '====================

    End If
   End If
  End If
  fn = Dir
 Loop

 For i = 1 To nDir
  searchFile dirList(i) & "\", Filter, Include_SubDir
 Next i
End Sub

' 取得指定文件的全部內容
Private Function getFileText(fn As String) As String
 On Error Resume Next

 Set f = fs.OpenTextFile(fn, forReading)
 getFileText = f.ReadAll
 f.Close
End Function

' 重寫指定文件的全部內容,並且傳回是否成功
Private Function saveFileText(fn As String, txt As String) As Boolean
 On Error GoTo ErrorHandler

 Set f = fs.OpenTextFile(fn, forWriting)
 f.write txt
 f.Close
 saveFileText = True

Exit Function
ErrorHandler:
 saveFileText = False
End Function

' 取得指定文件的全部內容(另一種方法)
'Private Function getFileText(fn As String) As String
' Open fn For Binary As #1
' getFileText = Input(LOF(1), 1)
' Close #1
'End Function


' 重寫指定文件的全部內容(另一種方法)
'Private Sub saveFileText(fn As String, txt As String)
' Open fn For Output As #1
' Print #1, txt
' Close #1
'End Sub


' 以系統的預設方式,開啟個別檔案
Private Sub openFile(fn as String)
 ShellExecute Me.hWnd, "open", fn, "", "", 1
End Sub

' 以 notepad.exe 檢視個別檔案
Private Sub viewFile(fn as String)
 ShellExecute Me.hWnd, "open", "notepad.exe", Chr(34) & fn & Chr(34), "", 1
End Sub

' 以 explorer.exe 瀏覽檔案的所在目錄
Private Sub exploreDir(fn as String)
 ShellExecute Me.hWnd, "open", "explorer.exe", "/e," & fs.GetParentFolderName(fn), "", 1
End Sub

可執行檔下載
瀏覽發行頁面
2005/01/08