메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Autoit ini 파일 key 와 value 텍스트 검색

데브카페

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=config.ico
#AutoIt3Wrapper_Res_Comment=Config INI Viewer
#AutoIt3Wrapper_Res_Description=INI 파일 키-값 뷰어
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Array.au3>

; ================================================================
; Config.ini Viewer - INI 파일 키-값 검색 및 표시 프로그램
; ================================================================

Global $hGUI, $idListView, $idSearchInput, $idFileInput
Global $idBtnBrowse, $idBtnLoad, $idBtnSearch, $idBtnClear, $idBtnExport, $idBtnEdit, $idBtnRefresh
Global $idStatusLabel, $idChkCaseSensitive, $idComboSection
Global $sCurrentFile = ""
Global $aOriginalData[0][3] ; Section, Key, Value 저장
Global $iDataCount = 0

Main()

Func Main()
    CreateGUI()
    GUISetState(@SW_SHOW, $hGUI)
    
    While 1
        Local $nMsg = GUIGetMsg()
        
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitProgram()
            
            Case $idBtnBrowse
                BrowseFile()
            
            Case $idBtnLoad
                LoadINIFile()
            
            Case $idBtnSearch
                SearchData()
            
            Case $idBtnClear
                ClearSearch()
            
            Case $idBtnExport
                ExportToCSV()
            
            Case $idBtnEdit
                EditSelectedItem()
            
            Case $idBtnRefresh
                RefreshData()
            
            Case $idComboSection
                FilterBySection()
            
        EndSwitch
    WEnd
EndFunc

Func CreateGUI()
    ; 메인 윈도우 생성
    $hGUI = GUICreate("Config.ini Viewer v1.0", 900, 600, -1, -1, $WS_OVERLAPPEDWINDOW)
    
    ; 파일 선택 영역
    GUICtrlCreateGroup("INI 파일 선택", 10, 10, 880, 60)
    
    GUICtrlCreateLabel("파일 경로:", 20, 30, 60, 20)
    $idFileInput = GUICtrlCreateInput("", 85, 28, 650, 22, $ES_READONLY)
    $idBtnBrowse = GUICtrlCreateButton("파일 선택", 745, 27, 70, 25)
    $idBtnLoad = GUICtrlCreateButton("불러오기", 825, 27, 60, 25)
    GUICtrlSetFont($idBtnLoad, 9, 600)
    
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    ; 검색 및 필터 영역
    GUICtrlCreateGroup("검색 및 필터", 10, 80, 880, 60)
    
    GUICtrlCreateLabel("검색:", 20, 105, 40, 20)
    $idSearchInput = GUICtrlCreateInput("", 65, 102, 300, 22)
    $idBtnSearch = GUICtrlCreateButton("검색", 375, 101, 60, 25)
    $idBtnClear = GUICtrlCreateButton("초기화", 445, 101, 60, 25)
    
    GUICtrlCreateLabel("섹션:", 530, 105, 40, 20)
    $idComboSection = GUICtrlCreateCombo("", 575, 102, 150, 20, $CBS_DROPDOWNLIST)
    GUICtrlSetData($idComboSection, "전체 섹션")
    GUICtrlSetState($idComboSection, $GUI_DISABLE)
    
    $idChkCaseSensitive = GUICtrlCreateCheckbox("대소문자 구분", 740, 104, 100, 20)
    
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    ; ListView 생성
    GUICtrlCreateGroup("검색 결과", 10, 150, 880, 390)
    
    $idListView = GUICtrlCreateListView("섹션|키|값", 20, 170, 860, 330, $LVS_REPORT + $LVS_GRIDLINES + $LVS_FULLROWSELECT, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)
    
    ; 컬럼 너비 설정
    _GUICtrlListView_SetColumnWidth($idListView, 0, 200)  ; 섹션
    _GUICtrlListView_SetColumnWidth($idListView, 1, 250)  ; 키
    _GUICtrlListView_SetColumnWidth($idListView, 2, 400)  ; 값
    
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    ; 하단 버튼 영역
    $idBtnRefresh = GUICtrlCreateButton("새로고침", 20, 555, 80, 30)
    $idBtnEdit = GUICtrlCreateButton("값 수정", 110, 555, 80, 30)
    $idBtnExport = GUICtrlCreateButton("CSV 내보내기", 200, 555, 100, 30)
    
    ; 상태 표시
    $idStatusLabel = GUICtrlCreateLabel("INI 파일을 선택하세요.", 320, 562, 550, 20)
    GUICtrlSetColor($idStatusLabel, 0x0000FF)
    
    ; 더블클릭으로 값 수정
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "OnListViewDoubleClick")
EndFunc

Func BrowseFile()
    Local $sFile = FileOpenDialog("INI 파일 선택", @ScriptDir, "INI 파일 (*.ini)|모든 파일 (*.*)", 1)
    
    If Not @error And $sFile <> "" Then
        GUICtrlSetData($idFileInput, $sFile)
        $sCurrentFile = $sFile
        UpdateStatus("파일이 선택되었습니다: " & $sFile)
    EndIf
EndFunc

Func LoadINIFile()
    Local $sFile = GUICtrlRead($idFileInput)
    
    If $sFile = "" Then
        MsgBox(48, "알림", "INI 파일을 먼저 선택해주세요.")
        Return
    EndIf
    
    If Not FileExists($sFile) Then
        MsgBox(16, "오류", "파일을 찾을 수 없습니다: " & $sFile)
        Return
    EndIf
    
    ; 기존 데이터 초기화
    _GUICtrlListView_DeleteAllItems($idListView)
    ReDim $aOriginalData[0][3]
    $iDataCount = 0
    
    UpdateStatus("파일을 읽는 중...")
    
    ; INI 파일 읽기
    Local $aSections = IniReadSectionNames($sFile)
    
    If @error Then
        MsgBox(16, "오류", "INI 파일을 읽을 수 없습니다.")
        UpdateStatus("오류: INI 파일을 읽을 수 없습니다.")
        Return
    EndIf
    
    ; 섹션 콤보박스 업데이트
    GUICtrlSetData($idComboSection, "전체 섹션")
    For $i = 1 To $aSections[0]
        GUICtrlSetData($idComboSection, $aSections[$i])
    Next
    GUICtrlSetState($idComboSection, $GUI_ENABLE)
    
    ; 각 섹션별로 키-값 읽기
    Local $iTotalItems = 0
    
    For $i = 1 To $aSections[0]
        Local $aKeys = IniReadSection($sFile, $aSections[$i])
        
        If Not @error Then
            For $j = 1 To $aKeys[0][0]
                ; 배열에 데이터 저장
                ReDim $aOriginalData[$iDataCount + 1][3]
                $aOriginalData[$iDataCount][0] = $aSections[$i]
                $aOriginalData[$iDataCount][1] = $aKeys[$j][0]
                $aOriginalData[$iDataCount][2] = $aKeys[$j][1]
                $iDataCount += 1
                
                ; ListView에 추가
                Local $iIndex = _GUICtrlListView_AddItem($idListView, $aSections[$i])
                _GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][0], 1)
                _GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][1], 2)
                
                $iTotalItems += 1
            Next
        EndIf
    Next
    
    UpdateStatus("총 " & $iTotalItems & "개 항목을 불러왔습니다. (섹션: " & $aSections[0] & "개)")
    
    ; 검색 입력란 활성화
    GUICtrlSetState($idSearchInput, $GUI_ENABLE)
    GUICtrlSetState($idBtnSearch, $GUI_ENABLE)
EndFunc

Func SearchData()
    Local $sSearchText = GUICtrlRead($idSearchInput)
    Local $bCaseSensitive = (GUICtrlRead($idChkCaseSensitive) = $GUI_CHECKED)
    
    If $sSearchText = "" Then
        MsgBox(48, "알림", "검색할 텍스트를 입력하세요.")
        Return
    EndIf
    
    ; ListView 초기화
    _GUICtrlListView_DeleteAllItems($idListView)
    
    Local $iFoundCount = 0
    
    ; 원본 데이터에서 검색
    For $i = 0 To $iDataCount - 1
        Local $sSection = $aOriginalData[$i][0]
        Local $sKey = $aOriginalData[$i][1]
        Local $sValue = $aOriginalData[$i][2]
        
        Local $bFound = False
        
        If $bCaseSensitive Then
            ; 대소문자 구분
            If StringInStr($sSection, $sSearchText) Or _
               StringInStr($sKey, $sSearchText) Or _
               StringInStr($sValue, $sSearchText) Then
                $bFound = True
            EndIf
        Else
            ; 대소문자 무시
            If StringInStr($sSection, $sSearchText, 0) Or _
               StringInStr($sKey, $sSearchText, 0) Or _
               StringInStr($sValue, $sSearchText, 0) Then
                $bFound = True
            EndIf
        EndIf
        
        If $bFound Then
            Local $iIndex = _GUICtrlListView_AddItem($idListView, $sSection)
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $sKey, 1)
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $sValue, 2)
            $iFoundCount += 1
        EndIf
    Next
    
    If $iFoundCount > 0 Then
        UpdateStatus($iFoundCount & "개 항목을 찾았습니다. (검색어: '" & $sSearchText & "')")
    Else
        UpdateStatus("검색 결과가 없습니다.")
        MsgBox(64, "검색 결과", "'" & $sSearchText & "'에 대한 검색 결과가 없습니다.")
    EndIf
EndFunc

Func ClearSearch()
    ; 검색 초기화 및 전체 데이터 표시
    GUICtrlSetData($idSearchInput, "")
    GUICtrlSetData($idComboSection, "전체 섹션")
    
    _GUICtrlListView_DeleteAllItems($idListView)
    
    ; 전체 데이터 다시 표시
    For $i = 0 To $iDataCount - 1
        Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])
        _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)
        _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)
    Next
    
    UpdateStatus("전체 " & $iDataCount & "개 항목을 표시합니다.")
EndFunc

Func FilterBySection()
    Local $sSelectedSection = GUICtrlRead($idComboSection)
    
    If $sSelectedSection = "전체 섹션" Or $sSelectedSection = "" Then
        ClearSearch()
        Return
    EndIf
    
    ; ListView 초기화
    _GUICtrlListView_DeleteAllItems($idListView)
    
    Local $iFoundCount = 0
    
    ; 선택된 섹션만 표시
    For $i = 0 To $iDataCount - 1
        If $aOriginalData[$i][0] = $sSelectedSection Then
            Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)
            $iFoundCount += 1
        EndIf
    Next
    
    UpdateStatus("'" & $sSelectedSection & "' 섹션: " & $iFoundCount & "개 항목")
EndFunc

Func EditSelectedItem()
    Local $iSelected = _GUICtrlListView_GetSelectedIndices($idListView)
    
    If $iSelected = "" Then
        MsgBox(48, "알림", "수정할 항목을 선택하세요.")
        Return
    EndIf
    
    ; 선택된 항목 정보 가져오기
    Local $sSection = _GUICtrlListView_GetItemText($idListView, $iSelected, 0)
    Local $sKey = _GUICtrlListView_GetItemText($idListView, $iSelected, 1)
    Local $sValue = _GUICtrlListView_GetItemText($idListView, $iSelected, 2)
    
    ; 새 값 입력받기
    Local $sNewValue = InputBox("값 수정", "새로운 값을 입력하세요:" & @CRLF & @CRLF & _
                                "섹션: " & $sSection & @CRLF & _
                                "키: " & $sKey, $sValue, "", 400, 200)
    
    If @error Then Return
    
    ; INI 파일에 저장
    If IniWrite($sCurrentFile, $sSection, $sKey, $sNewValue) Then
        ; ListView 업데이트
        _GUICtrlListView_SetItemText($idListView, $iSelected, $sNewValue, 2)
        
        ; 원본 데이터 배열 업데이트
        For $i = 0 To $iDataCount - 1
            If $aOriginalData[$i][0] = $sSection And $aOriginalData[$i][1] = $sKey Then
                $aOriginalData[$i][2] = $sNewValue
                ExitLoop
            EndIf
        Next
        
        UpdateStatus("값이 성공적으로 수정되었습니다.")
        MsgBox(64, "성공", "값이 성공적으로 수정되었습니다.")
    Else
        MsgBox(16, "오류", "값을 수정하는데 실패했습니다.")
    EndIf
EndFunc

Func RefreshData()
    ; 현재 파일 다시 불러오기
    If $sCurrentFile <> "" And FileExists($sCurrentFile) Then
        LoadINIFile()
        UpdateStatus("데이터를 새로고침했습니다.")
    Else
        MsgBox(48, "알림", "불러온 파일이 없습니다.")
    EndIf
EndFunc

Func ExportToCSV()
    Local $iItemCount = _GUICtrlListView_GetItemCount($idListView)
    
    If $iItemCount = 0 Then
        MsgBox(48, "알림", "내보낼 데이터가 없습니다.")
        Return
    EndIf
    
    Local $sFile = FileSaveDialog("CSV로 저장", @DesktopDir, "CSV 파일 (*.csv)", 16, "config_export.csv")
    
    If @error Or $sFile = "" Then Return
    
    ; CSV 파일 생성
    Local $hFile = FileOpen($sFile, 2)  ; 덮어쓰기 모드
    
    If $hFile = -1 Then
        MsgBox(16, "오류", "파일을 생성할 수 없습니다.")
        Return
    EndIf
    
    ; 헤더 쓰기
    FileWriteLine($hFile, "섹션,키,값")
    
    ; 데이터 쓰기
    For $i = 0 To $iItemCount - 1
        Local $sSection = _GUICtrlListView_GetItemText($idListView, $i, 0)
        Local $sKey = _GUICtrlListView_GetItemText($idListView, $i, 1)
        Local $sValue = _GUICtrlListView_GetItemText($idListView, $i, 2)
        
        ; CSV 형식으로 쓰기 (값에 쉼표가 있을 경우 따옴표로 감싸기)
        If StringInStr($sValue, ",") Then
            FileWriteLine($hFile, '"' & $sSection & '","' & $sKey & '","' & $sValue & '"')
        Else
            FileWriteLine($hFile, $sSection & "," & $sKey & "," & $sValue)
        EndIf
    Next
    
    FileClose($hFile)
    
    UpdateStatus($iItemCount & "개 항목을 CSV 파일로 저장했습니다: " & $sFile)
    
    ; 파일 열기 여부 확인
    If MsgBox(36, "완료", "CSV 파일로 내보내기가 완료되었습니다." & @CRLF & @CRLF & "파일을 여시겠습니까?") = 6 Then
        ShellExecute($sFile)
    EndIf
EndFunc

Func OnListViewDoubleClick()
    ; ListView 더블클릭시 값 수정
    If @GUI_CtrlId = $idListView Then
        EditSelectedItem()
    EndIf
EndFunc

Func UpdateStatus($sMessage)
    GUICtrlSetData($idStatusLabel, $sMessage)
    GUICtrlSetColor($idStatusLabel, 0x000000)
EndFunc

Func ExitProgram()
    Exit
EndFunc

; 추가 유틸리티 함수들

Func CreateSampleINI()
    ; 샘플 INI 파일 생성 (테스트용)
    Local $sSampleFile = @ScriptDir & "\sample_config.ini"
    
    If FileExists($sSampleFile) Then Return $sSampleFile
    
    IniWrite($sSampleFile, "Database", "Host", "localhost")
    IniWrite($sSampleFile, "Database", "Port", "3306")
    IniWrite($sSampleFile, "Database", "Username", "admin")
    IniWrite($sSampleFile, "Database", "Password", "password123")
    
    IniWrite($sSampleFile, "Application", "Version", "1.0.0")
    IniWrite($sSampleFile, "Application", "Language", "Korean")
    IniWrite($sSampleFile, "Application", "Theme", "Dark")
    
    IniWrite($sSampleFile, "Paths", "DataDir", "C:\Data")
    IniWrite($sSampleFile, "Paths", "LogDir", "C:\Logs")
    IniWrite($sSampleFile, "Paths", "TempDir", "C:\Temp")
    
    Return $sSampleFile
EndFunc

; 컨텍스트 메뉴 추가 (선택적)
Func CreateContextMenu()
    Local $hMenu = GUICtrlCreateContextMenu($idListView)
    GUICtrlCreateMenuItem("값 수정", $hMenu)
    GUICtrlCreateMenuItem("행 복사", $hMenu)
    GUICtrlCreateMenuItem("-", $hMenu)
    GUICtrlCreateMenuItem("삭제", $hMenu)
EndFunc

Comments