Что нового

Работа с текстовыми файлами

gagarin74

Новичок
Добрый день. Помогите пожалуйста.
Есть каталог D:\baza\
В нем лежат файлы (1.txt 2.txt 3.txt)
1 нужно по ключевому слову провести в них поиск. И подсветить файлы в которых встречается это слово.
Список файлов выводятся через GUICtrlCreateList.

2 нужно открывать файлы для просмотра (без редактирования) и при проявление желания (нужно что то подправить) войти в режим редактирования с последующем сохранением изменений.

p.s. GUICtrlCreateLabel - открывает на просмотр (но не могу допетрить как прокрутку сделать если файлы длинные ). WS_VSCROLL - скролинг отображает но он не активный
p.s1. если в режиме "редактирования" будет внутри autoit открыватся блокнот - тоже сносно. Не путайте с run (notepad.exe) - нужно открывать его внутри программы как встроенное приложение (что бы пользователь не мог его закрыть (перетащить мышкой) ).
 

joiner

Модератор
Локальный модератор
Для просмотра и редактирования есть элемент Edit. Там автоматически создается прокрутка текста
 

Tempo

Скриптер
Код:
;~ AutoIt Version:    3.3.14.5
;~ Author:            Tempo
#AutoIt3Wrapper_UseX64=y
#include <GUIConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>
#include <WinAPI.au3>
#include <WinAPIEx.au3>

Global Const $INI_FILE = StringLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, ".", 0, -1)) & "ini"
Global $g_hGuiMain, _
        $g_idDmEditor, _
        $g_idInpFolder, _
        $g_idInpKeyword, _
        $g_idInpMask, _
        $g_idListFiles, _
        $g_idChkRegExp, _
        $g_aFiles[] = [0]

Exit Main()

Func Main()
    Opt("TrayAutoPause", 0)
    Opt("GUIResizeMode", BitOR($GUI_DOCKMENUBAR, $GUI_DOCKLEFT, $GUI_DOCKRIGHT))
    $g_hGuiMain = GUICreate(@ScriptName, 600, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_COMPOSITED)
    GUISetOnEvent($GUI_EVENT_CLOSE, OnClose)

    $g_idDmEditor = GUICtrlCreateDummy()

    $g_idInpFolder = GUICtrlCreateInput("", 5, 5, 380, 20)
    GUICtrlSetTip(-1, "Каталог")
    _GUICtrlEdit_SetCueBanner(-1, "Каталог", True)

    $g_idInpMask = GUICtrlCreateInput(IniRead($INI_FILE, "Config", "Mask", "*.txt"), 390, 5, 100, 20)
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
    GUICtrlSetTip(-1, "Маска")
    _GUICtrlEdit_SetCueBanner(-1, "Маска", True)

    Local $idBtnSelect = GUICtrlCreateButton("Выбрать", 495, 5, 100, 20, $BS_DEFPUSHBUTTON)
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
    Local $idMenuUpdate = GUICtrlCreateMenuItem("Обновить", GUICtrlCreateContextMenu($idBtnSelect))

    $g_idInpKeyword = GUICtrlCreateInput("", 5, 30, 485, 20)
    GUICtrlSetTip(-1, "Ключевое слово")
    _GUICtrlEdit_SetCueBanner(-1, "Ключевое слово", True)

    $g_idChkRegExp = GUICtrlCreateCheckbox("Рег. выраж.", 495, 30, 100, 20)
    GUICtrlSetTip(-1, "Регулярные выражения")
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
    If Number(IniRead($INI_FILE, "Config", "RegExp", 0)) Then GUICtrlSetState(-1, $GUI_CHECKED)

    $g_idListFiles = GUICtrlCreateList("", 0, 55, 600, 345, BitOR($LBS_NOINTEGRALHEIGHT, $WS_VSCROLL), 0)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUICtrlSetFont(-1, 10)

    GUIRegisterMsg($WM_COMMAND, WM_COMMAND)
    LoadWindowPlacement()

    GUICtrlSetData($g_idInpFolder, IniRead($INI_FILE, "Config", "Folder", @ScriptDir))
    OnAutoItExitRegister(OnExit)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $g_idDmEditor
                ShowEditor()
            Case $g_idChkRegExp
                FilterFiles()
            Case $idBtnSelect
                SelectFolder()
            Case $idMenuUpdate
                OnChangeFolder()
        EndSwitch
    WEnd
EndFunc   ;==>Main

Func LoadWindowPlacement()
    GUISetState(@SW_HIDE) ; Resizing
    Local $aRECT = StringSplit(IniRead($INI_FILE, "WindowPlacement", "rcNormalPosition", ""), "|")
    If $aRECT[0] = 4 Then
        Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)
        $tWP.rcNormalPosition(1) = $aRECT[1]
        $tWP.rcNormalPosition(2) = $aRECT[2]
        $tWP.rcNormalPosition(3) = $aRECT[3]
        $tWP.rcNormalPosition(4) = $aRECT[4]
        _WinAPI_SetWindowPlacement($g_hGuiMain, $tWP)
    EndIf
    GUISetState(IniRead($INI_FILE, "WindowPlacement", "showCmd", @SW_SHOW))
EndFunc   ;==>LoadWindowPlacement

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam, $wParam
    If $hWnd = $g_hGuiMain Then
        Switch _WinAPI_HiWord($wParam)
            Case $EN_CHANGE
                Switch _WinAPI_LoWord($wParam)
                    Case $g_idInpFolder, $g_idInpMask
                        AdlibRegister(OnChangeFolder, 500)
                    Case $g_idInpKeyword
                        If $g_aFiles[0] Then AdlibRegister(OnChangeKeyword, 500)
                EndSwitch
            Case $LBN_DBLCLK
                If _WinAPI_LoWord($wParam) = $g_idListFiles Then
                    Local $sFile = GUICtrlRead($g_idListFiles)
                    If $sFile Then GUICtrlSendToDummy($g_idDmEditor, $sFile)
                EndIf
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func OnChangeFolder()
    AdlibUnRegister(OnChangeFolder)
    Local $sFolder = GUICtrlRead($g_idInpFolder)
    If Not $sFolder Then $sFolder = @ScriptDir

    Local $aFiles = _FileListToArray($sFolder, GUICtrlRead($g_idInpMask), $FLTA_FILES)
    If Not @error Then
        FileChangeDir($sFolder)
        $g_aFiles = $aFiles
        FilterFiles()
    Else
        Dim $g_aFiles[] = [0]
        GUICtrlSetData($g_idListFiles, "")
    EndIf
EndFunc   ;==>OnChangeFolder

Func OnChangeKeyword()
    AdlibUnRegister(OnChangeKeyword)
    FilterFiles()
EndFunc   ;==>OnChangeKeyword

Func FilterFiles()
    Local $fuCompare = BitAND(GUICtrlRead($g_idChkRegExp), $GUI_CHECKED) ? StringRegExp : StringInStr
    Local $sKeyword = GUICtrlRead($g_idInpKeyword), $bFilter = Not $sKeyword, $sFiles
    For $i = 1 To $g_aFiles[0]
        If $bFilter Or $fuCompare(FileRead($g_aFiles[$i]), $sKeyword) Then $sFiles &= "|" & $g_aFiles[$i]
    Next
    GUICtrlSetData($g_idListFiles, $sFiles)
EndFunc   ;==>FilterFiles

Func SelectFolder()
    Local $sFolder = FileSelectFolder("", @WorkingDir, 0, "", $g_hGuiMain)
    If @error Then Return

    GUICtrlSetData($g_idInpFolder, $sFolder)
EndFunc   ;==>SelectFolder

Func OnClose()
    Exit
EndFunc   ;==>OnClose

Func OnExit()
    IniWrite($INI_FILE, "Config", "Folder", GUICtrlRead($g_idInpFolder))
    IniWrite($INI_FILE, "Config", "Mask", GUICtrlRead($g_idInpMask))
    IniWrite($INI_FILE, "Config", "RegExp", Number(BitAND(GUICtrlRead($g_idChkRegExp), $GUI_CHECKED) = $GUI_CHECKED))

    Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)
    If $tWP.showCmd = @SW_SHOWMINIMIZED Then $tWP.showCmd = BitAND($tWP.flags, $WPF_RESTORETOMAXIMIZED) ? @SW_SHOWMAXIMIZED : @SW_SHOW
    IniWrite($INI_FILE, "WindowPlacement", "showCmd", $tWP.showCmd)
    IniWrite($INI_FILE, "WindowPlacement", "rcNormalPosition", _
            $tWP.rcNormalPosition(1) & "|" & _
            $tWP.rcNormalPosition(2) & "|" & _
            $tWP.rcNormalPosition(3) & "|" & _
            $tWP.rcNormalPosition(4))
EndFunc   ;==>OnExit

Func ShowEditor()
    GUISetState(@SW_HIDE)
    Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)

    Local $sFile = GUICtrlRead($g_idDmEditor)
    Local $sText = FileRead($sFile)
    Local $hGuiEdit = GUICreate($sFile, 805, 600, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_COMPOSITED)
    Local $idEditText = GUICtrlCreateEdit("", 0, 0, 805, 560, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY), 0)
    _GUICtrlEdit_SetLimitText($idEditText, -1)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUICtrlSetData(-1, $sText)

    Local $idBtnEdit = GUICtrlCreateButton("Редактировать", 300, 565, 100, 30)
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))

    Local $idBtnSave = GUICtrlCreateButton("Сохранить", 300, 565, 100, 30)
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))
    GUICtrlSetState(-1, $GUI_HIDE)

    Local $idBtnCancel = GUICtrlCreateButton("Отмена", 405, 565, 100, 30, $BS_DEFPUSHBUTTON)
    GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))

    GUISetState(@SW_HIDE) ; Resizing
    _WinAPI_SetWindowPlacement($hGuiEdit, $tWP)
    GUISetState($tWP.showCmd) ; Msg

    Local $iMsg, $bReadOnly = True, $hFile, $iVisibleLine
    While 1
        $iMsg = GUIGetMsg()
        Switch $iMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idBtnEdit
                GUICtrlSetState($idBtnEdit, $GUI_HIDE)
                $bReadOnly = False
                _GUICtrlEdit_SetReadOnly($idEditText, $bReadOnly)
                GUICtrlSetState($idBtnSave, $GUI_SHOW)
            Case $idBtnCancel
                If $bReadOnly Then ExitLoop
                ContinueCase
            Case $idBtnSave
                GUICtrlSetState($idBtnSave, $GUI_HIDE)
                $bReadOnly = True
                _GUICtrlEdit_BeginUpdate($idEditText)
                _GUICtrlEdit_SetReadOnly($idEditText, $bReadOnly)
                If $iMsg = $idBtnSave Then
                    $sText = GUICtrlRead($idEditText)
                    $hFile = FileOpen($sFile, BitOR($FO_OVERWRITE, FileGetEncoding($sFile)))
                    FileWrite($hFile, $sText)
                    FileClose($hFile)
                Else
                    If $sText <> GUICtrlRead($idEditText) Then
                        $iVisibleLine = _GUICtrlEdit_GetFirstVisibleLine($idEditText)
                        GUICtrlSetData($idEditText, $sText)
                        _GUICtrlEdit_LineScroll($idEditText, 0, $iVisibleLine)
                    EndIf
                EndIf
                _GUICtrlEdit_EndUpdate($idEditText)
                GUICtrlSetState($idBtnEdit, $GUI_SHOW)
        EndSwitch
    WEnd
    $tWP = _WinAPI_GetWindowPlacement($hGuiEdit)
    GUIDelete()
    _WinAPI_SetWindowPlacement($g_hGuiMain, $tWP)
    GUISetState($tWP.showCmd) ; Msg
EndFunc   ;==>ShowEditor
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Вариант попроще:
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <File.au3>

Global $aLV_Items[1]
Global $sPath = 'D:\Baza'
Global $sMask = '*.txt'
Global $sKeyword = 'test'
Global $iHighlight_Color = 0xF0ED9E

Global $iLast_Sel = -1

$hGUI = GUICreate('Example', 500, 500)

$iLV = GUICtrlCreateListView('File', 20, 20, 460, 260)
_LoadFiles()

$iEdit_Bttn = GUICtrlCreateButton('Edit', 20, 290, 70, 20)
$iEdit = GUICtrlCreateEdit('', 20, 310, 460, 180, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iEdit_Bttn
            Switch GUICtrlRead($iEdit_Bttn)
                Case 'Edit'
                    GUICtrlSetData($iEdit_Bttn, 'Ok')
                    GUICtrlSetStyle($iEdit, $GUI_SS_DEFAULT_EDIT)
                Case Else
                    GUICtrlSetData($iEdit_Bttn, 'Edit')
                    GUICtrlSetStyle($iEdit, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
                    
                    If MsgBox(52, 'Save?', 'Save to file?', 0, $hGUI) = 6 Then
                        $hFile = FileOpen($sPath & '\' & StringRegExpReplace(GUICtrlRead($iLast_Sel), '\|+$', ''), 2)
                        FileWrite($hFile, GUICtrlRead($iEdit))
                        FileClose($hFile)
                    EndIf
            EndSwitch
    EndSwitch
    
    If $iLast_Sel <> GUICtrlRead($iLV) Then
        $iLast_Sel = GUICtrlRead($iLV)
        GUICtrlSetData($iEdit, FileRead($sPath & '\' & StringRegExpReplace(GUICtrlRead($iLast_Sel), '\|+$', '')))
        GUICtrlSetData($iEdit_Bttn, 'Edit')
        GUICtrlSetState($iEdit_Bttn, ($iLast_Sel ? $GUI_ENABLE : $GUI_DISABLE))
    EndIf
WEnd

Func _LoadFiles()
    Local $aFiles = _FileListToArray($sPath, $sMask, $FLTA_FILES)
    
    If @error Then
        Return
    EndIf
    
    ReDim $aLV_Items[$aLV_Items[0] + UBound($aFiles)]
    
    For $i = 1 To UBound($aFiles) - 1
        $aLV_Items[0] += 1
        $aLV_Items[$aLV_Items[0]] = GUICtrlCreateListViewItem($aFiles[$i], $iLV)
        
        If StringInStr(FileRead($sPath & '\' & $aFiles[$i]), $sKeyword) Then
            GUICtrlSetBkColor($aLV_Items[$aLV_Items[0]], $iHighlight_Color)
        EndIf
    Next
    
    _GUICtrlListView_SetColumnWidth($iLV, 0, -1)
EndFunc
 
Автор
G

gagarin74

Новичок
Друзья!!!!! БОЛЬШУЩЕЕ спасибо. СПАСИБО всем кто откликнулся.Правда,очень приятно!!!!!! Здоровья всем. Оба кода запустились без проблем!!!! Идеи и скелеты возьму из обоих. Буду всем Вас рекомендовать. ЕЩЕ РАЗ СПАСИБО.
Сообщение автоматически объединено:

Еще раз прошу извинения.
Полностью подходит код от TEMPO (спасибо).



Но вот один вопрос или просьба. Весь проект задумывался заменить интернет версию Битрикс24 раздел WIKI. И представленное решение полностью соответствует.
Кроме одной детали. Так как в этих документах будет встречаться информация не бубличная -желательно все содержимое "прятать " от посторонних.ю
Конечно можно это все спрятать и методами паролей на папки и вообще запрятать в структуру папок nas хронилища. Спрятать на каком либо FTP итд итп. Но это не совсем "правильно".
Может у кого то есть наработки в сторону шифрование дешефрование? Пусть даже на уровне "школы". Достаточно модуль который при сохранение текста умножал бы все символы ASCII на 5 (2,3,4 не важно). А при открытие (поиске) делил бы на 5 (2,3,4 не важно). Тогда при открытие текста простым блокнотом "злоумышленник" получал бы не читаемый текст. Я прекрасно понимаю что эта защита примитивная, но на уровни "любопытных"пользователей предприятия -то что надо. Я технически-административно к сожалению не могу все это запрятать "вне" компании.
Но постоянно выполнять просьбы N-ого количества работников занести какую либо информацию в Битрикс24 я тоже уже запарился.
Да, я понимаю все мои высказывания у кого то вызовут улыбку на лице. Но поверьте все зависит от квалификации сотрудников. У нас не ITшное предприятие. Я один раз ,уже на RDP сервере поставил галочку смена паролей после 70 дней. Все предприятие встало в ступор.
 

Tempo

Скриптер
Может у кого то есть наработки в сторону шифрование дешефрование? Пусть даже на уровне "школы". Достаточно модуль который при сохранение текста умножал бы все символы ASCII на 5 (2,3,4 не важно). А при открытие (поиске) делил бы на 5 (2,3,4 не важно). Тогда при открытие текста простым блокнотом "злоумышленник" получал бы не читаемый текст. Я прекрасно понимаю что эта защита примитивная, но на уровни "любопытных"пользователей предприятия -то что надо.
Crypt Management
 
Автор
G

gagarin74

Новичок
Спасибочки, то что нужно . Буду ковыряться. Попробовал демо код - то что нужно.
Сообщение автоматически объединено:

Кстати интересная штука получается. Если применять скрипт с функцией _Crypt_DecryptFile , для "расшифрования " не зашифрованного файла - он его зашифрует. Если опять повторить операцию он его расшифрует.
 
Последнее редактирование:
Верх