#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <file.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("批量文件编码转换、字符替换", 450, 350, 192, 124)
$path_label = GUICtrlCreateLabel("目录", 20, 20, 30, 30)
$path_input = GUICtrlCreateInput("", 60, 16, 250, 25)
$path_button = GUICtrlCreateButton("指定目录..", 320, 15, 80, 25)
$find_label = GUICtrlCreateLabel("查找", 20, 60, 28, 17)
$find_edit = GUICtrlCreateEdit("", 60, 60, 350, 100)
$reg_check = GUICtrlCreateCheckbox("正则查找、替换", 60, 160, 100, 20)
$replace_lable = GUICtrlCreateLabel("换成", 20, 180, 28, 17)
$replace_edit = GUICtrlCreateEdit("", 60, 180, 350, 100)
$to_utf8_button = GUICtrlCreateButton("转成utf-8", 100, 296, 90, 30)
$to_ansi_button = GUICtrlCreateButton("转成ANSI", 200, 296, 90, 30)
$exit_button = GUICtrlCreateButton("退出", 300, 296, 90, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $exit_button
Exit
Case $path_button
$path = FileSelectFolder("遍历目录,包含子目录", "")
GUICtrlSetData($path_input,$path)
Case $to_utf8_button
char_convert_replace(266)
Case $to_ansi_button
char_convert_replace(10)
EndSwitch
WEnd
;批量转换,替换
Func char_convert_replace($codepage)
$get_path = GUICtrlRead($path_input)
$chk_path=FileExists($get_path)
If not $chk_path Then ;检查路径
MsgBox(16,"错误提示","没有选择目录,或者目录不存在!")
Else
$file_type = InputBox("提示","请输入要转换文件的类型,如:html,txt等文本类型。*表示所有文件。"&@CRLF&"主意:转换后,会删除源文件,请主意转换前备份","*")
$array = myFileListToArray_StringReg($get_path,"\."&$file_type&"$")
If $array[0] == 0 Then
MsgBox(16,"错误提示","指定目录找不到指定类型的文件")
Else
;循环数组,转换编码,替换字符
For $i=1 To $array[0]
$check_dir = FileGetSize($array[$i])
If $check_dir >0 Then ;排除目录、空文件
;读取,删除源文件
$file=FileOpen($array[$i])
$get=FileRead($file)
FileClose($file)
FileDelete($array[$i])
;字符替换
$find = GUICtrlRead($find_edit)
$replace = GUICtrlRead($replace_edit)
If StringLen($find) > 0 Then ;如果查找字符存在
If GUICtrlRead($reg_check) ==1 Then ;正则替换
$get = StringRegExpReplace($get,$find,$replace)
Else
MsgBox(0,"","我在这里")
$get = StringReplace($get,$find,$replace)
EndIf
EndIf
;生成utf8 文件
$tofile=FileOpen($array[$i],$codepage)
FileWrite($tofile,$get)
FileClose($tofile)
EndIf
Next
MsgBox(0,"提示","文件转换完成")
EndIf
EndIf
EndFunc
;遍历目录,包含子目录
Func myFileListToArray_StringReg($s_dir, $s_filt = ".*?", $i_flag = 0, $b_subdir=True, $s_ex="")
If StringRight($s_dir,1)="" Then $s_dir = StringTrimRight($s_dir,1)
If $i_flag<1 Or $i_flag>2 Then $i_flag=0;规范
Local $i_step = 40000 ;每$i_step个文件重新定义一次数组大小,当文件很多时,此值就发挥作用
Local $a_return[$i_step+1];初始数组大小,[0]存放共有多少个文件,因为每次一直ReDim很慢的
Local $i_count = 1;记录找到多少个文件$i_count-1
Local $a_dir[2];初始数组大小,[0]存放共有多少个文件,因为每次一直ReDim很慢的
$a_dir[0] = 1;做到第几个数组,代替递归
$a_dir[1] = $s_dir
$i_dirCount = 1;共有多少个数组,代替递归用的变量
Local $a_dir_temp, $isdir, $a_temp
Local $file, $search
While $a_dir[0]<UBound($a_dir);代替递归
$s_dir = $a_dir[$a_dir[0]]
$a_dir_temp = _FileListToArray($s_dir, "*", 0)
If UBound($a_dir_temp) <= 1 Then
$a_dir[0] += 1
ContinueLoop
EndIf
$i_dirCount = 1
For $i = 1 To UBound($a_dir_temp)-1
;$isdir=DirGetSize($s_dir &"" & $a_dir_temp[$i])
$isdir = StringInStr(FileGetAttrib($s_dir & "" & $a_dir_temp[$i]), "D")
If $b_subdir And $isdir>0 Then
_ArrayInsert($a_dir, $a_dir[0]+$i_dirCount, $s_dir &""& $a_dir_temp[$i])
$i_dirCount += 1
EndIf
Select
Case $i_flag=1;文件
If $isdir>0 Then ContinueLoop
Case $i_flag=2;目录
If $isdir<=0 Then ContinueLoop
EndSelect
If Not StringRegExp($a_dir_temp[$i], $s_filt, 0) Then ContinueLoop;正则匹配
;这里可加其他条件
If $s_ex<>"" And StringRegExp($a_dir_temp[$i], $s_ex, 0) Then ContinueLoop;排除文件名
;-------------------------
;-----如果每找到一个文件就执行一个自定义函数,将此处改为自定义函数
If $i_Count +1 > UBound($a_return)-1 Then ReDim $a_return[UBound($a_return)+$i_step]
$a_return[$i_Count] = $s_dir &""& $a_dir_temp[$i]
;--------------------------------------
$i_Count += 1
Next
$a_dir[0] += 1
WEnd;代替递归结束
$a_return[0] = $i_count - 1
;-----如果每找到一个文件就执行一个自定义函数,考虑返回 $i_count - 1(即多少个符合条件的文件)
ReDim $a_return[$i_count]
Return $a_return
;---------------------------------------------------------------
EndFunc
正则式替换不好用,求帮忙修改