Loopback
|
Posted: Thu Oct 14, 2010 21:44 Post subject: |
|
|
Ладно, вот что получилось. Сделал как понял, если что не так - будем поправлять в рабочем порядке.
Code: |
;; Параметры: %L
If $CmdLine[0] < 1 Then
MsgBox (0, "", "Недостаточно параметров, должно быть 1.")
Exit
EndIf
Global $aList = _TCHLoadFileList($CmdLine[1])
Global $gBackups = False, $gCaseSence = 0
Global Const $GUI_CHECKED = 1
Global $gRemoveEmpty = False
Global $gIniFile = StringLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, ".", 0, -1)) & "ini"
$hGUI = GUICreate("Вставка текста", 549, 570, -1, -1)
$edTextLeft = GUICtrlCreateEdit("", 8, 96, 529, 73)
$btnOK = GUICtrlCreateButton("OK", 384, 528, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 464, 528, 75, 25)
GUICtrlCreateLabel("начинающейся на", 198, 70, 94, 17, 0x2)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, 520, 137, 17)
$edMask = GUICtrlCreateInput("*.*", 8, 24, 265, 21)
GUICtrlCreateLabel("Маска файлов", 8, 6, 78, 17)
$edTextRight = GUICtrlCreateEdit("", 8, 208, 529, 73)
$edTextBefore = GUICtrlCreateEdit("", 8, 320, 529, 73)
$edTextAfter = GUICtrlCreateEdit("", 8, 432, 529, 73)
GUICtrlCreateLabel("заканчивающейся на", 176, 182, 113, 17, 0x2)
GUICtrlCreateLabel("начинающейся на", 196, 294, 95, 17, 0x2)
GUICtrlCreateLabel("заканчивающейся на", 176, 406, 113, 17, 0x2)
$ibFilterLeft = GUICtrlCreateInput("", 296, 66, 241, 21)
$ibFilterRight = GUICtrlCreateInput("", 296, 178, 241, 21)
$ibFilterBefore = GUICtrlCreateInput("", 296, 290, 241, 21)
$ibFilterAfter = GUICtrlCreateInput("", 296, 402, 241, 21)
GUICtrlCreateLabel("", 8, 56, 528, 2, 0x10)
GUIStartGroup()
$Radio1 = GUICtrlCreateRadio("Добавить к строке слева", 8, 69, 153, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetTip(-1, "Приоритет над п.3")
$Radio3 = GUICtrlCreateRadio("Добавить сверху строки", 8, 293, 153, 17)
GUICtrlSetTip(-1, "Приоритет над п.1")
GUIStartGroup()
$Radio2 = GUICtrlCreateRadio("Добавить к строке справа", 8, 181, 161, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetTip(-1, "Приоритет над п.4")
$Radio4 = GUICtrlCreateRadio("Добавить снизу строки", 8, 405, 153, 17)
GUICtrlSetTip(-1, "Приоритет над п.2")
$cbBackups = GUICtrlCreateCheckbox("Создавать резервные копии", 160, 520, 193, 17)
$cbRemoveEmpty = GUICtrlCreateCheckbox("Удалять пустые строки", 8, 544, 150, 17)
$cbCloseDone = GUICtrlCreateCheckbox("Закрывать по завершению", 160, 544, 160, 17)
Global $AccelTable[1][2] = [["^{ENTER}", $btnOK]]
GUISetAccelerators($AccelTable)
GUISetState(@SW_SHOW)
GUICtrlSetState($cbCaseSence, IniRead($gIniFile, "Settings", "CaseSenseSearch", 4))
GUICtrlSetState($cbBackups, IniRead($gIniFile, "Settings", "MakeBackups", 4))
GUICtrlSetState($cbRemoveEmpty, IniRead($gIniFile, "Settings", "RemoveEmptyLines", 4))
GUICtrlSetState($cbCloseDone, IniRead($gIniFile, "Settings", "CloseWhenDone", 1))
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $btnCancel
Exit
Case $btnOK
$gMask = _MaskToRegexp(GUICtrlRead($edMask))
$gBackups = BitAND(GUICtrlRead($cbBackups), $GUI_CHECKED)
$gRemoveEmpty = BitAND(GUICtrlRead($cbRemoveEmpty), $GUI_CHECKED)
If BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED) Then $gCaseSence = 1
WinSetState($hGUI, "", @SW_DISABLE)
IniWrite($gIniFile, "Settings", "CaseSenseSearch", GUICtrlRead($cbCaseSence))
IniWrite($gIniFile, "Settings", "MakeBackups", GUICtrlRead($cbBackups))
IniWrite($gIniFile, "Settings", "RemoveEmptyLines", GUICtrlRead($cbRemoveEmpty))
IniWrite($gIniFile, "Settings", "CloseWhenDone", GUICtrlRead($cbCloseDone))
For $i = 1 To $aList[0]
If StringRight($aList[$i], 1) = "\" Then
_DoFolder($aList[$i])
Else
_DoFile($aList[$i])
EndIf
Next
MsgBox (0, "", "Завершено.", 0, $hGUI)
If BitAND(GUICtrlRead($cbCloseDone), $GUI_CHECKED) Then Exit
WinSetState($hGUI, "", @SW_ENABLE)
EndSwitch
WEnd
Func _DoFolder($sFolder)
If $sFolder = "" Then Return
Local $sDirs = ""
Local $hSearch = FileFindFirstFile($sFolder & "*.*")
If @error Then Return
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
$sDirs &= $sFolder & $sFile & "\" & @LF
ContinueLoop
EndIf
_DoFile($sFolder & $sFile)
Wend
FileClose($hSearch)
; Обработку каталогов приходится делать отдельно,
; чтобы не оставлять открытый поисковый хэндл,
; их максимально может быть 64
$aDirs = StringSplit($sDirs, @LF)
For $i = 1 To $aDirs[0]
_DoFolder($aDirs[$i])
Next
EndFunc
Func _ProcessLines(ByRef $aSrcFile, ByRef $aTrgFile, $sText, $sFilter, $nMode)
If $sText = "" Then Return
For $i = 1 To $aSrcFile[0]
Switch $nMode
Case 0, 2
If ($sFilter <> "") Then
$sLeft = StringLeft($aSrcFile[$i], StringLen($sFilter))
If $gCaseSence Then
If Not ($sLeft == $sFilter) Then ContinueLoop
Else
If $sLeft <> $sFilter Then ContinueLoop
EndIf
EndIf
If $nMode = 2 Then $aTrgFile[$i] = @CRLF & $aTrgFile[$i]
$aTrgFile[$i] = $sText & $aTrgFile[$i]
Case 1, 3
If ($sFilter <> "") Then
$sRight = StringRight($aSrcFile[$i], StringLen($sFilter))
If $gCaseSence Then
If Not ($sRight == $sFilter) Then ContinueLoop
Else
If $sRight <> $sFilter Then ContinueLoop
EndIf
EndIf
If $nMode = 3 Then $aTrgFile[$i] = $aTrgFile[$i] & @CRLF
$aTrgFile[$i] = $aTrgFile[$i] & $sText
EndSwitch
Next
EndFunc
Func _DoFile($sFile)
If StringRegExp(StringLower($sFile), $gMask) = 0 Then Return
Local $aSrcFile = _TCHLoadFileList($sFile)
If $gRemoveEmpty And ($aSrcFile[0] > 0) Then
Local $aTrgFile[$aSrcFile[0]+1] = [0]
For $i = 1 To $aSrcFile[0]
If $aSrcFile[$i] <> "" Then
$aTrgFile[0] += 1
$aTrgFile[$aTrgFile[0]] = $aSrcFile[$i]
EndIf
Next
ReDim $aTrgFile[$aTrgFile[0] + 1]
$aSrcFile = $aTrgFile
Else
Local $aTrgFile = $aSrcFile
EndIf
If BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) Then
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextLeft), GUICtrlRead($ibFilterLeft), 0)
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextbefore), GUICtrlRead($ibFilterBefore), 2)
Else
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextbefore), GUICtrlRead($ibFilterBefore), 2)
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextLeft), GUICtrlRead($ibFilterLeft), 0)
EndIf
If BitAND(GUICtrlRead($Radio3), $GUI_CHECKED) Then
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextRight), GUICtrlRead($ibFilterRight), 1)
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextAfter), GUICtrlRead($ibFilterAfter), 3)
Else
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextAfter), GUICtrlRead($ibFilterAfter), 3)
_ProcessLines($aSrcFile, $aTrgFile, GUICtrlRead($edTextRight), GUICtrlRead($ibFilterRight), 1)
EndIf
If $gBackups Then FileCopy($sFile, $sFile & ".bak", 1) ; бэкап
Local $hFile = FileOpen($sFile, 2)
For $i = 1 To $aTrgFile[0]
FileWriteLine($hFile, $aTrgFile[$i])
Next
FileClose($hFile)
EndFunc
Func _MaskToRegexp($sMask)
$sMask = StringRegExpReplace($sMask, "(\\|\.|\+|\^|\(|\)|\[|\]|\{|\}|\$)", "\\\1")
$sMask = StringReplace($sMask, "?", ".")
$sMask = StringReplace($sMask, "*", ".+?")
Return StringLower("(?i)" & $sMask & "$")
EndFunc
; fast list load function
Func _TCHLoadFileList($sFileName, $nIncBlock = 1000)
Local $asList[$nIncBlock + 1] = [0]
Local $hfList = FileOpen($sFileName, 0)
Local $nCounter = 0
While 1
For $i = 1 To $nIncBlock
$asList[$nCounter + $i] = FileReadLine($hfList)
If @error Then
ReDim $asList[UBound($asList) + $i - $nIncBlock - 1]
ExitLoop(2)
EndIf
Next
$nCounter += $nIncBlock
ReDim $asList[UBound($asList)+$nIncBlock]
Wend
FileClose($hfList)
$asList[0] = UBound($asList)-1
Return $asList
EndFunc
|
Last edited by Loopback on Wed Oct 20, 2010 13:44; edited 3 times in total |
|