AutoHotKey

오토핫키 강좌 (초보편 #07)_스크랩

닝구르 2014. 9. 20. 05:02

파일관련 명령어들

오토핫키는 파일을 다루는 명령어들이 상당수 있습니다. 이번 강좌는 파일을 다루는 방법에 대해서 몇번에 걸쳐 이야기 하고자 합니다.
기본적으로 파일을 다루는 명령어들이 할수 있는 일은 새로운 파일을 생성하고, 삭제하고, 이동 및 복사 등등의 작업이 가능할 것입니다.  이전 강의에서  FileSelectFileFileSelectFolder  두가지 명령어를 기억하시리라 생각됩니다. 

오토핫키가 파일에 대해서 할수 있는 일들

  1. 새로운 파일의 생성 및 적재
  2. .lnk 파일에서 숏컷(핫키) 의 정보를 가지고 온다
  3. 폴더 생성 및 삭제, 이름 바꾸기
  4. 파일 정보 취득 (생성일, 버전, 속성, 크기 등등)
  5. 파일관련 모든 작업 가능
뭐 더이상 무슨 말이 필요하겠습니까만.  명령어에 대한 간략한 정보를 알아보고 넘어가겠습니다.
  • SetWorkingDir 스크립트의 작업 디렉토리를 변경 
    • 작업 디렉토리를 변경하는 명령어로 스크립트와는 상관없이 설정이 가능합니다.
  • FileInstall  스크립트를Ahk2Exe.exe그리고 실행 파일을 만들 경우, 지정 파일을 실행 파일내에 묻는다 
  • Drive cd 롬광학 드라이브의 트레이의 개폐, 드라이브의 볼륨 레벨의 변경 
  • DriveGet 드라이브의 각종 정보를 취득 
  • DriveSpaceFree  드라이브의 빈 용량을메가바이트 단위로 취득 
  • FileCopyDir  폴더를 카피한다 
  • FileMoveDir  폴더를 이동한다 
  • FileRemoveDir 폴더를 삭제한다 
  • FileCreateDir 폴더를 작성 
  • FileRecycle 파일을 쓰레기통에 넣는다 
  • FileRecycleEmpty 쓰레기통을 비운다 
  • FileCopy  파일을 카피한다 
  • FileMove  파일을 이동·rename 한다 
  • FileDelete  파일을 삭제한다 
  • FileCreateShortcut 쇼트 컷(.lnk)(을)를 작성한다 
  • FileGetShortcut 쇼트 컷(.lnk)의 각종 정보를 취득한다 
  • FileGetAttrib  파일의 속성을 취득 
  • FileGetSize  파일의 사이즈를 취득 
  • FileGetTime  파일의 타임 스탬프를 취득 
  • FileGetVersion  프로그램 파일의 버젼 정보를 취득 
  • FileSetAttrib  하나 이상의 파일의 속성을 변경 
  • FileSetTime  파일이나 폴더의 타임 스탬프를(일괄)변경 
  • FileRead 텍스트 파일의 전내용을 변수에 읽어들인다 
  • FileReadLine  텍스트 파일로부터1행 읽어들인다 
  • FileAppend 텍스트 파일에 추가 기입.파일이 존재하지 않으면 작성된다. 
  • FileSelectFile  파일 선택 다이얼로그를 표시 
  • FileSelectFolder  폴더 선택 다이얼로그를 표시 
  • IfExist / IfNotExist 지정한 파일이나 디렉토리가 존재할지로 분기 
  • FileExist() 파일이 존재할지의 체크와 속성의 취득을 실시할 수 있는 함수. 
  • Loop(files) 패턴에 일치하는 파일 각각 붙어 융통반네 해를 실시한다 
  • Loop,READ 텍스트 파일을1행씩 읽어들여, 반복 처리를 실시한다 
  • SplitPath 파일 패스나URL(을)를 드라이브나 확장자(extension)등의 요소 로 분해한다 

 

 

여기에서 전에 언급한 IfExist / IfNotExist  전용조건문이 보이네요 

명령어 들을보니 도스시절 사용하던 mDIR 같은 툴도 만들수 있을꺼 같습니다. 나중에 프로젝트를 진행하면서 한번 해봐야겠네요

자세한 명령어는 해당 명령어를 선택해서 보시기 바랍니다.

님투 파일관리기 프로그램 하나 만들어 보았습니다. 아래 프로그램을 다운 받아서 실행하시던지 아래 소스를 직접 실행하던지 편한데로 프로그램이 어떻게 동작하는지 보시기 바랍니다.

 

 

Nimto_Dir.exe

 

 

소스를 보실려면 더보기를 클릭하세요

 

더보기 부분 ::===================================================================================================

 

#SingleInstance force ; 같은 스크립트의 다중 프로세스로 실행의 금지/허가설정

#NoTrayIcon            ; 프로그램이 트레이로 들어가지 않도록
#NoEnv                 ; 변수명을 해석할 때, 환경 변수를 무시한다

Gui, +Resize +MinSize  ; 창크기변화 하게
Gui, Font, s10, Arial ; 폰트 지정
Gui, Add, Edit, x6 y10 w250 h22 vDirSelect, c:/
Gui, Add, Button, x+6 y10 w50 h22 gDirSelectBt, ...
Gui, Add, Button, x+13 w50 h22 gDirSelectView, View
Gui, Add, Edit, x+6 w40 h22 vFileListnum, 40
Gui, Add, Edit, x+6 w70 h22 vFileListType, *.*
Gui, Add, CheckBox, x+6 w120 h20 vSubFileall, 서브모두
Gui, Add, ListView, x0 y40 r20 w700 vDirFilelist glistClick, N|Name|Size|Modified|FullPath
Gui, Show, w700 h403,님투 파일관리기
Return

;--------------------------------------------
; 폴더 선택
;--------------------------------------------
DirSelectBt:
FileSelectFolder, dndir, , 3  
if dndir = 
{ 
  return 
}
GuiControl,, DirSelect, %dndir% 
Return 


;--------------------------------------------
; 해당 파일이 실행될 경우
;--------------------------------------------
listClick:
   CoordMode,MOUSE,RELATIVE
   MouseGetPos,mx,my,oID,oCNN
   If(A_GuiEvent = "DoubleClick")
   {   Gosub Doubleclick
   }
Return

Doubleclick:

Return


;--------------------------------------------
; 선택된 폴더의 파일목록
;--------------------------------------------
DirSelectView:
Gui,Submit, NoHide
;--------------------------------------------
; 목록 다시 시작
;--------------------------------------------
LV_Delete()
;--------------------------------------------
; 전달 받은 폴더/파일마스크,,서브목록옵션
; Loop, 폴더     : 현재 폴더의 파일만
; Loop, 폴더,, 1 : 서브폴더의 파일전체
;--------------------------------------------
Loop, %DirSelect%\%FileListType%,, %SubFileall%
{   
  ;------------------------------------------
  ; 지정한 갯수를 출력하고 빠져나온다
  ; 기본 40 개
  ;------------------------------------------
  If A_Index>%FileListnum%
      Break
  ;------------------------------------------
  ; 번호|파일명|크기|생성일|패치
  ; N|Name|Size|Modified|FullPath
  ;------------------------------------------
  LV_Add("", A_Index, A_LoopFileName, A_LoopFileSize, A_LoopFileTimeModified, A_LoopFileLongPath)
}
;--------------------------------------------
; 셀크기 자동화
LV_ModifyCol()
Return 

GuiSize:
;--------------------------------------------
; 창크기에 변화가 있을 경우 같이 크기가 변할
; 오브젝트 지정
;--------------------------------------------
Anchor("DirFilelist", "wh")
Return

GuiClose:
;--------------------------------------------
; 이 항목이 없으면 X 로 종료해도 프로세스에서
; 종료되지 않는다.
;--------------------------------------------
ExitApp

;--------------------------------------------
; 크기 자동함수
;--------------------------------------------
Anchor(i, a = "", r = false) {
  static c, cs = 12, cx = 255, cl = 0, g, gs = 8, z = 0, k = 0xffff, gx = 1
  If z = 0
    VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), z := true
  If a =
  {
    StringLeft, gn, i, 2
    If gn contains :
    {
      StringTrimRight, gn, gn, 1
      t = 2
    }
    StringTrimLeft, i, i, t ? t : 3
    If gn is not digit
      gn := gx
  }
  Else gn := A_Gui
  If i is not xdigit
  {
    GuiControlGet, t, Hwnd, %i%
    If ErrorLevel = 0
      i := t
    Else ControlGet, i, Hwnd, , %i%
  }
  gb := (gn - 1) * gs
  Loop, %cx%
    If (NumGet(c, cb := cs * (A_Index - 1)) == i) {
      If a =
      {
        cf = 1
        Break
      }
      Else gx := A_Gui
      d := NumGet(g, gb), gw := A_GuiWidth - (d >> 16 & k), gh := A_GuiHeight - (d & k), as := 1
        , dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short")
        , dw := NumGet(c, cb + 8, "Short"), dh := NumGet(c, cb + 10, "Short")
      Loop, Parse, a, xywh
        If A_Index > 1
          av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField)
            , d%av% += (InStr("yh", av) ? gh : gw) * (A_LoopField + 0 ? A_LoopField : 1)
      DllCall("SetWindowPos", "UInt", i, "Int", 0, "Int", dx, "Int", dy, "Int", dw, "Int", dh, "Int", 4)
      If r != 0
        DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) ; RDW_UPDATENOW | RDW_INVALIDATE
      Return
    }
  If cf != 1
    cb := cl, cl += cs
  If (!NumGet(g, gb)) {
    Gui, %gn%:+LastFound
    WinGetPos, , , , gh
    VarSetCapacity(pwi, 68, 0), DllCall("GetWindowInfo", "UInt", WinExist(), "UInt", &pwi)
      , NumPut(((bx := NumGet(pwi, 48)) << 16 | by := gh - A_GuiHeight - NumGet(pwi, 52)), g, gb + 4)
      , NumPut(A_GuiWidth << 16 | A_GuiHeight, g, gb)
  }
  Else d := NumGet(g, gb + 4), bx := d >> 16, by := d & k
  ControlGetPos, dx, dy, dw, dh, , ahk_id %i%
  If cf = 1
  {
    Gui, %gn%:+LastFound
    WinGetPos, , , gw, gh
    d := NumGet(g, gb), dw -= gw - bx * 2 - (d >> 16), dh -= gh - by - bx - (d & k)
  }
  NumPut(i, c, cb), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short")
    , NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short")
  Return, true
}

==========================================================================================================

 

 

 


 

 

소스를 직접 실행시키면서 계속 계속 조금더 조금더 고쳐보도록 해야 합니다. 그래서 완전히 자기 것으로 만들지 않으면 이런 강좌는 아무짝에도 쓸모가 없게 됩니다.   계속 노력해서 자기 것으로 만드세요 ....