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

오토잇 폴더 내부 텍스트

데브카페

autoit 폴더 내부 텍스트


#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=search.ico
#AutoIt3Wrapper_Res_Description=텍스트 파일 검색 프로그램
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_ProductVersion=1.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <String.au3>
#include <StringConstants.au3>

; ===== 전역 변수 =====
Global $g_hGUI, $g_idFolderPath, $g_idSearchText, $g_idResultList
Global $g_idBtnBrowse, $g_idBtnSearch, $g_idBtnSave, $g_idBtnClear
Global $g_idChkRegex, $g_idChkCase, $g_idChkSubFolder
Global $g_idCmbFileType, $g_idProgressBar, $g_idStatusBar
Global $g_aResults[1][6] ; [파일경로, 상대경로, 라인번호, 라인내용, 파일크기, 수정일시]
Global $g_iResultCount = 0
Global $g_sBaseFolder = ""

; 지원할 파일 확장자
Global $g_aFileTypes[11][2] = [["전체 텍스트 파일", "*.txt;*.log;*.sql;*.ini;*.cfg;*.conf;*.properties"], _
                              ["텍스트 파일 (*.txt)", "*.txt"], _
                              ["로그 파일 (*.log)", "*.log"], _
                              ["SQL 파일 (*.sql)", "*.sql"], _
                              ["설정 파일 (*.ini;*.cfg;*.conf)", "*.ini;*.cfg;*.conf"], _
                              ["스크립트 파일 (*.py;*.js;*.vbs;*.au3)", "*.py;*.js;*.vbs;*.au3"], _
                              ["웹 파일 (*.html;*.htm;*.xml;*.json)", "*.html;*.htm;*.xml;*.json"], _
                              ["배치 파일 (*.bat;*.cmd;*.ps1)", "*.bat;*.cmd;*.ps1"], _
                              ["오라클 추적 파일 (*.trc)", "*.trc"], _
                              ["마크다운 (*.md)", "*.md"], _
                              ["모든 파일 (*.*)", "*.*"]]

Main()

Func Main()
    CreateGUI()
    
    While 1
        Local $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
                
            Case $g_idBtnBrowse
                BrowseFolder()
                
            Case $g_idBtnSearch
                StartSearch()
                
            Case $g_idBtnSave
                SaveResults()
                
            Case $g_idBtnClear
                ClearResults()
                
            Case $g_idResultList
                If @extended = $NM_DBLCLK Then
                    OpenSelectedFile()
                EndIf
        EndSwitch
    WEnd
    
    GUIDelete()
EndFunc

Func CreateGUI()
    ; 메인 윈도우 생성
    $g_hGUI = GUICreate("텍스트 파일 검색 프로그램 v1.0 - Oracle DBA Tools", 900, 650, -1, -1, $WS_OVERLAPPEDWINDOW)
    
    ; 폴더 선택 그룹
    GUICtrlCreateGroup("검색 경로", 10, 10, 880, 60)
    GUICtrlCreateLabel("폴더:", 20, 35, 40, 20)
    $g_idFolderPath = GUICtrlCreateInput("", 65, 32, 730, 23)
    $g_idBtnBrowse = GUICtrlCreateButton("찾기", 805, 30, 80, 27)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
    
    ; 검색 옵션 그룹
    GUICtrlCreateGroup("검색 옵션", 10, 80, 880, 90)
    
    GUICtrlCreateLabel("검색어:", 20, 105, 50, 20)
    $g_idSearchText = GUICtrlCreateInput("", 75, 102, 300, 23)
    
    GUICtrlCreateLabel("파일 형식:", 390, 105, 60, 20)
    $g_idCmbFileType = GUICtrlCreateCombo("", 455, 102, 200, 200, $CBS_DROPDOWNLIST)
    
    ; 파일 형식 콤보박스 채우기
    Local $sFileTypes = ""
    For $i = 0 To UBound($g_aFileTypes) - 1
        $sFileTypes &= $g_aFileTypes[$i][0]
        If $i < UBound($g_aFileTypes) - 1 Then $sFileTypes &= "|"
    Next
    GUICtrlSetData($g_idCmbFileType, $sFileTypes, $g_aFileTypes[0][0])
    
    $g_idBtnSearch = GUICtrlCreateButton("검색 시작", 680, 100, 100, 27)
    $g_idBtnClear = GUICtrlCreateButton("결과 지우기", 790, 100, 90, 27)
    
    ; 체크박스 옵션들
    $g_idChkCase = GUICtrlCreateCheckbox("대소문자 구분", 20, 135, 100, 20)
    $g_idChkRegex = GUICtrlCreateCheckbox("정규식 사용", 130, 135, 100, 20)
    $g_idChkSubFolder = GUICtrlCreateCheckbox("하위 폴더 포함", 240, 135, 100, 20)
    GUICtrlSetState($g_idChkSubFolder, $GUI_CHECKED) ; 기본적으로 체크
    
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
    
    ; 결과 리스트뷰
    GUICtrlCreateGroup("검색 결과", 10, 180, 880, 400)
    $g_idResultList = GUICtrlCreateListView("파일명|상대 경로|라인|내용|크기|수정일시", 20, 200, 860, 350, $LVS_REPORT + $LVS_SHOWSELALWAYS)
    _GUICtrlListView_SetColumnWidth($g_idResultList, 0, 150)  ; 파일명
    _GUICtrlListView_SetColumnWidth($g_idResultList, 1, 250)  ; 상대경로
    _GUICtrlListView_SetColumnWidth($g_idResultList, 2, 50)   ; 라인
    _GUICtrlListView_SetColumnWidth($g_idResultList, 3, 300)  ; 내용
    _GUICtrlListView_SetColumnWidth($g_idResultList, 4, 70)   ; 크기
    _GUICtrlListView_SetColumnWidth($g_idResultList, 5, 120)  ; 수정일시
    GUICtrlCreateGroup("", -99, -99, 1, 1) ; 그룹 종료
    
    ; 하단 버튼들
    $g_idBtnSave = GUICtrlCreateButton("결과 저장", 20, 590, 100, 30)
    GUICtrlCreateButton("도움말", 130, 590, 80, 30)
    
    ; 상태바
    $g_idStatusBar = GUICtrlCreateLabel("준비됨", 20, 630, 860, 15)
    
    GUISetState(@SW_SHOW)
EndFunc

Func BrowseFolder()
    Local $sFolder = FileSelectFolder("검색할 폴더를 선택하세요", "", 1)
    If $sFolder <> "" Then
        GUICtrlSetData($g_idFolderPath, $sFolder)
        $g_sBaseFolder = $sFolder
    EndIf
EndFunc

Func StartSearch()
    Local $sFolder = GUICtrlRead($g_idFolderPath)
    Local $sSearchText = GUICtrlRead($g_idSearchText)
    
    ; 입력값 검증
    If $sFolder = "" Then
        MsgBox(16, "오류", "검색할 폴더를 선택해주세요.")
        Return
    EndIf
    
    If Not FileExists($sFolder) Then
        MsgBox(16, "오류", "선택한 폴더가 존재하지 않습니다.")
        Return
    EndIf
    
    If $sSearchText = "" Then
        MsgBox(16, "오류", "검색어를 입력해주세요.")
        Return
    EndIf
    
    ; 검색 옵션 읽기
    Local $bCaseSensitive = (GUICtrlRead($g_idChkCase) = $GUI_CHECKED)
    Local $bUseRegex = (GUICtrlRead($g_idChkRegex) = $GUI_CHECKED)
    Local $bIncludeSubFolder = (GUICtrlRead($g_idChkSubFolder) = $GUI_CHECKED)
    
    Local $iFileTypeIndex = _GUICtrlComboBox_GetCurSel($g_idCmbFileType)
    Local $sFilePattern = $g_aFileTypes[$iFileTypeIndex][1]
    
    ; 결과 초기화
    ClearResults()
    
    ; 검색 시작
    GUICtrlSetData($g_idStatusBar, "검색 중...")
    GUICtrlSetState($g_idBtnSearch, $GUI_DISABLE)
    
    $g_sBaseFolder = $sFolder
    SearchInFolder($sFolder, $sSearchText, $sFilePattern, $bCaseSensitive, $bUseRegex, $bIncludeSubFolder)
    
    GUICtrlSetState($g_idBtnSearch, $GUI_ENABLE)
    GUICtrlSetData($g_idStatusBar, "검색 완료: " & $g_iResultCount & "개 결과 발견")
    
    If $g_iResultCount = 0 Then
        MsgBox(64, "검색 완료", "검색 결과가 없습니다.")
    Else
        MsgBox(64, "검색 완료", $g_iResultCount & "개의 결과를 찾았습니다.")
    EndIf
EndFunc

Func SearchInFolder($sFolder, $sSearchText, $sFilePattern, $bCaseSensitive, $bUseRegex, $bIncludeSubFolder)
    Local $aFiles, $aFileList
    Local $sSearchPattern = $bIncludeSubFolder ? "*" : ""
    
    ; 파일 패턴을 배열로 분할
    Local $aPatterns = StringSplit($sFilePattern, ";", $STR_NOCOUNT)
    
    For $sPattern In $aPatterns
        If $bIncludeSubFolder Then
            $aFiles = _FileListToArrayRec($sFolder, $sPattern, $FLTAR_FILES, $FLTAR_RECUR)
        Else
            $aFiles = _FileListToArray($sFolder, $sPattern, $FLTAR_FILES)
        EndIf
        
        If Not @error And IsArray($aFiles) Then
            For $i = 1 To $aFiles[0]
                Local $sFilePath = $bIncludeSubFolder ? $aFiles[$i] : $sFolder & "\" & $aFiles[$i]
                SearchInFile($sFilePath, $sSearchText, $bCaseSensitive, $bUseRegex)
                
                ; 상태 업데이트 (너무 자주 하지 않도록)
                If Mod($i, 50) = 0 Then
                    GUICtrlSetData($g_idStatusBar, "검색 중... (" & $i & "/" & $aFiles[0] & " 파일)")
                EndIf
            Next
        EndIf
    Next
EndFunc

Func SearchInFile($sFilePath, $sSearchText, $bCaseSensitive, $bUseRegex)
    Local $hFile = FileOpen($sFilePath, $FO_READ + $FO_UTF8_NOBOM)
    If $hFile = -1 Then
        ; UTF-8로 실패하면 ANSI로 시도
        $hFile = FileOpen($sFilePath, $FO_READ)
        If $hFile = -1 Then Return
    EndIf
    
    Local $sContent = FileRead($hFile)
    FileClose($hFile)
    
    If $sContent = "" Then Return
    
    ; 줄 단위로 분할
    Local $aLines = StringSplit($sContent, @CRLF, $STR_ENTIRESPLIT + $STR_NOCOUNT)
    
    ; 파일 정보 가져오기
    Local $iFileSize = FileGetSize($sFilePath)
    Local $sModifiedTime = FileGetTime($sFilePath, $FT_MODIFIED, $FT_STRING)
    
    ; 각 줄에서 검색
    For $i = 0 To UBound($aLines) - 1
        Local $sLine = $aLines[$i]
        Local $bFound = False
        
        If $bUseRegex Then
            ; 정규식 검색
            Local $aResult = StringRegExp($sLine, $sSearchText, $STR_REGEXPARRAYMATCH)
            If Not @error And IsArray($aResult) Then
                $bFound = True
            EndIf
        Else
            ; 일반 텍스트 검색
            Local $sSearchLine = $bCaseSensitive ? $sLine : StringLower($sLine)
            Local $sSearchTerm = $bCaseSensitive ? $sSearchText : StringLower($sSearchText)
            If StringInStr($sSearchLine, $sSearchTerm) > 0 Then
                $bFound = True
            EndIf
        EndIf
        
        If $bFound Then
            AddResult($sFilePath, $i + 1, $sLine, $iFileSize, $sModifiedTime)
        EndIf
    Next
EndFunc

Func AddResult($sFilePath, $iLineNumber, $sLineContent, $iFileSize, $sModifiedTime)
    ; 결과 배열 확장
    ReDim $g_aResults[$g_iResultCount + 1][6]
    
    ; 상대 경로 계산
    Local $sRelativePath = StringReplace($sFilePath, $g_sBaseFolder & "\", "")
    If $sRelativePath = $sFilePath Then $sRelativePath = StringReplace($sFilePath, $g_sBaseFolder, "")
    
    ; 파일명만 추출
    Local $aPathParts = StringSplit($sFilePath, "\", $STR_NOCOUNT)
    Local $sFileName = $aPathParts[UBound($aPathParts) - 1]
    
    ; 결과 저장
    $g_aResults[$g_iResultCount][0] = $sFilePath
    $g_aResults[$g_iResultCount][1] = $sRelativePath
    $g_aResults[$g_iResultCount][2] = $iLineNumber
    $g_aResults[$g_iResultCount][3] = StringLeft($sLineContent, 200) ; 최대 200자만
    $g_aResults[$g_iResultCount][4] = Round($iFileSize / 1024, 1) & " KB"
    $g_aResults[$g_iResultCount][5] = $sModifiedTime
    
    ; 리스트뷰에 추가
    Local $sItem = $sFileName & "|" & $sRelativePath & "|" & $iLineNumber & "|" & _
                   StringReplace($sLineContent, @TAB, " ") & "|" & _
                   Round($iFileSize / 1024, 1) & " KB|" & $sModifiedTime
    
    GUICtrlCreateListViewItem($sItem, $g_idResultList)
    
    $g_iResultCount += 1
EndFunc

Func ClearResults()
    ; 리스트뷰 클리어
    _GUICtrlListView_DeleteAllItems($g_idResultList)
    
    ; 결과 배열 초기화
    ReDim $g_aResults[1][6]
    $g_iResultCount = 0
    
    GUICtrlSetData($g_idStatusBar, "결과가 초기화되었습니다.")
EndFunc

Func SaveResults()
    If $g_iResultCount = 0 Then
        MsgBox(16, "오류", "저장할 결과가 없습니다.")
        Return
    EndIf
    
    Local $sSaveFile = FileSaveDialog("검색 결과 저장", @MyDocumentsDir, "텍스트 파일 (*.txt)|모든 파일 (*.*)", $FD_PATHMUSTEXIST, "search_results.txt")
    
    If $sSaveFile <> "" Then
        Local $hFile = FileOpen($sSaveFile, $FO_OVERWRITE + $FO_CREATEPATH + $FO_UTF8_NOBOM)
        If $hFile = -1 Then
            MsgBox(16, "오류", "파일을 생성할 수 없습니다.")
            Return
        EndIf
        
        ; 헤더 정보
        FileWriteLine($hFile, "=== 텍스트 파일 검색 결과 ===")
        FileWriteLine($hFile, "생성일시: " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
        FileWriteLine($hFile, "검색 경로: " & $g_sBaseFolder)
        FileWriteLine($hFile, "총 결과: " & $g_iResultCount & "건")
        FileWriteLine($hFile, "=" & StringRepeat("=", 80))
        FileWriteLine($hFile, "")
        
        ; 결과 데이터
        For $i = 0 To $g_iResultCount - 1
            FileWriteLine($hFile, "파일: " & $g_aResults[$i][0])
            FileWriteLine($hFile, "라인: " & $g_aResults[$i][2])
            FileWriteLine($hFile, "내용: " & $g_aResults[$i][3])
            FileWriteLine($hFile, "크기: " & $g_aResults[$i][4])
            FileWriteLine($hFile, "수정일: " & $g_aResults[$i][5])
            FileWriteLine($hFile, StringRepeat("-", 80))
        Next
        
        FileClose($hFile)
        
        MsgBox(64, "저장 완료", "검색 결과가 저장되었습니다." & @CRLF & $sSaveFile)
        
        ; 저장된 파일 열기 여부 확인
        Local $iResult = MsgBox(36, "파일 열기", "저장된 파일을 열어보시겠습니까?")
        If $iResult = 6 Then ; Yes
            ShellExecute($sSaveFile)
        EndIf
    EndIf
EndFunc

Func OpenSelectedFile()
    Local $iSelected = _GUICtrlListView_GetNextItem($g_idResultList)
    If $iSelected >= 0 Then
        Local $sFilePath = $g_aResults[$iSelected][0]
        Local $iLineNumber = $g_aResults[$iSelected][2]
        
        ; 파일 열기 옵션 제공
        Local $iChoice = MsgBox(35, "파일 열기", "파일을 어떻게 열까요?" & @CRLF & @CRLF & _
                               "예(Y): 메모장으로 열기" & @CRLF & _
                               "아니오(N): 기본 프로그램으로 열기" & @CRLF & _
                               "취소: 파일 경로 복사")
        
        Switch $iChoice
            Case 6 ; Yes - 메모장
                Run("notepad.exe " & '"' & $sFilePath & '"')
                
            Case 7 ; No - 기본 프로그램
                ShellExecute($sFilePath)
                
            Case 2 ; Cancel - 경로 복사
                ClipPut($sFilePath)
                MsgBox(64, "복사 완료", "파일 경로가 클립보드에 복사되었습니다.")
        EndSwitch
    EndIf
EndFunc

; Oracle DBA를 위한 추가 유틸리티 함수들

Func SearchOracleErrors()
    ; Oracle 에러 패턴들을 미리 정의
    Local $aOracleErrors[5] = ["ORA-\d{5}", "TNS-\d{5}", "RMAN-\d{5}", "SP2-\d{4}", "PLS-\d{5}"]
    
    ; 콤보박스에서 Oracle 관련 파일 선택
    ; 구현 생략...
EndFunc

Func SearchSQLPatterns()
    ; 자주 사용되는 SQL 패턴들
    Local $aSQLPatterns[6] = ["SELECT.*FROM", "INSERT.*INTO", "UPDATE.*SET", "DELETE.*FROM", "CREATE.*TABLE", "ALTER.*TABLE"]
    
    ; 구현 생략...
EndFunc

Comments