Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Добавление текста до/после строк в выделенных файл-списках 
Author Message
Loopback



PostPosted: Thu Oct 14, 2010 21:44    Post subject: Reply with quote

Ладно, вот что получилось. Сделал как понял, если что не так - будем поправлять в рабочем порядке.

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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group