컴퓨터 프로그래밍/Autohotkey

[오토핫키 서버 연동] 2. 다운로더 (폴더 선택: FileSelectFolder, 다운로드 상태 바: Progress, 다운로드 함수)

나노콛 2019. 8. 19. 18:25

* 전체 소스코드를 순서대로 올리지 않기 때문에 프로그래밍 언어 이해를 요구합니다.

이전 포스팅에서

구축한 서버에 자료를 업로드해서 오토핫키 프로그램으로 업로드한 자료를 받을 수 있습니다.

업로드한 자료를 다운로드할 수 있는 프로그램을 만들어 보겠습니다.

예시 프로그램

 

먼저 구축한 서버에 333.gif, 111.gif 파일을 업로드해두었습니다.

그리고 업로드한 파일에 각각 내용을 저장해서 txt로 2개 업로드했습니다.

내용을 저장해서 텍스트로 업로드 한 이유는

해당 텍스트를 읽어와 프로그램에 표시하기 위해서입니다.

업로드한 txt 파일 내용은 위에 스샷에서 볼 수 있듯이 '전설의 짤', '전설의 짤2'입니다.

gui 소스 코드입니다.

Gui, Add, CheckBox, x12 y10 w200 h30 vfirst, %first%
Gui, Add, CheckBox, x12 y+3 w200 h30 vsecond, %second%
Gui, Add, Edit, x12 y+3 w230 h20 vDirSelect, %dir%
Gui, Add, Button, x252 y9 w60 h60 ,체크받기
Gui, Add, Button, x252 y75 w60 h20 gDirSelectBt, 폴더선택
Gui, Add, Button, x252 y+5 w60 h20 gopenfolder,폴더열기
Gui, Show, h145 w325, 다운로더
Return

GuiClose:
ExitApp

 

CheckBox의 텍스트는 변수 first, second로 설정하고 있기 때문에

first, second의 값을 할당해줄 다음 코드는 이 코드 위에 들어가야 합니다.

urldownloadtofile, https://*****/first.txt, first.txt
urldownloadtofile, https://*****/second.txt, second.txt

// 서버의 txt 파일을 다운로드합니다.
// 경로를 지정하지 않았기 때문에 실행파일과 같은 경로에 다운로드 됩니다.


fileread, first, first.txt
fileread, second, second.txt

// 다운로드한 파일을 읽어 first, second 변수에 저장합니다.


filedelete, first.txt
filedelete, second.txt

// 내용은 변수에 담았기 때문에 불필요한 파일은 삭제합니다.

 

여기까지 진행되었다면

서버의 txt 파일을 받아 내용을 변수에 저장하고 그 변수를 이용해 체크박스의 내용을 설정합니다.

저장할 경로를 지정하는 부분

DirSelectBt:
  FileSelectFolder, dndir, , 3
  if dndir =
  {
     return
  }
  GuiControl,, DirSelect, %dndir%
  GUI, Submit, NoHide
IniWrite, %DirSelect%, dir.ini, dir, dir 
 Return

openfolder:
iniread, dir,  dir.ini, dir, dir
run, %dir%
return

FileSelectFolder 명령어를 이용해서 폴더 선택 다이얼로그를 띄우고 지정한 폴더는 ini 파일로 저장합니다.

ini 파일로 저장하는 이유는 설정한 경로를 프로그램 종료 후 재 실행했을 때도 같은 경로를 사용하기 편하게 하기 위해서입니다.

그러기 위해서는 아래 코드를 선택한 경로를 보여주는 텍스트 박스 위에 작성해야 합니다.

iniread, dir,  dir.ini, dir, dir

 

FileSelectFolder, (선택된 경로가 들어가는 변수), (루트 디렉터리 생략 시 내 컴퓨터), (1 - 새 폴더 아이콘, 2 - 폴더 이름 란 표시 비트 연산되기 때문에 3이라 쓰면 1,2옵션이 통합됨)

폴더 열기 버튼은 run 명령어로 해당 폴더 경로를 탐색기로 열어줍니다.

다운로드

button체크받기:
Gui, Submit, Nohide
iniread, dir,  dir.ini, dir, dir

if (first = 1)
{
	Url            = https://*****/img/333.gif
	DownloadAs     = %dir%/333.gif
	Overwrite      := True 
	UseProgressBar := True
	DownloadFile(Url, DownloadAs, Overwrite, UseProgressBar)
}


if (second = 1)
{
    Url            = https://*****/img/111.gif
	DownloadAs     = %dir%/111.gif
	Overwrite      := True 
	UseProgressBar := True
	DownloadFile(Url, DownloadAs, Overwrite, UseProgressBar)
}
Return

체크한 항목만 다운로드합니다.

사실 다운로드만 하는 거라면 UrlDownloadToFile 명령어를 사용하면 됩니다.

UrlDownloadToFile, (다운로드할 url 주소), (실제로 저장될 경로/파일명)

다운로드가 완료된 것을 확인하기 위해 프로그레스 바를 이용한

다운로드 함수를 사용했습니다.

DownloadFile(UrlToFile, SaveFileAs, Overwrite := True, UseProgressBar := True) {
      If (!Overwrite && FileExist(SaveFileAs))
          Return
      If (UseProgressBar) {
            // http 헤더값을 이용해 UrlToFile 경로에있는 파일의 용량을 확인합니다.
            WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
            WebRequest.Open("HEAD", UrlToFile)
            WebRequest.Send()
            FinalSize := WebRequest.GetResponseHeader("Content-Length")

            // 프로그레스 바를 설정합니다. H값은 프로그레스창의 높이입니다.
            // 두 번째 인자는 프로그레스 바의 범위입니다. 기본값은 0~100입니다.
            // 세 번째 인자는 프로그레스 바에 표시될 텍스트 입니다.
            Progress, H80, , Downloading..., %UrlToFile%
            SetTimer, __UpdateProgressBar, 100
      }

      // 실제로 파일을 다운로드 하는 구간입니다.
      UrlDownloadToFile, %UrlToFile%, %SaveFileAs%

      // 다운로드가 완료되어 프로그레스 바를 제거합니다.
      If (UseProgressBar) {
          Progress, Off
          SetTimer, __UpdateProgressBar, Off
      }
    Return
    
     // 프로그레스 바의 진행도를 업데이트합니다.
      __UpdateProgressBar:
            // 다운로드한 파일의 현재 사이즈를 확인합니다.
            CurrentSize := FileOpen(SaveFileAs, "r").Length
            // os를 구동하고 진행된 시간을 담습니다.
            CurrentSizeTick := A_TickCount
            // 현재 사이즈와 마지막 사이즈를 빼고, 흐른시간을 계산해 다운로드 속도를 표시합니다.
            Speed := Round((CurrentSize/1024-LastSize/1024)/((CurrentSizeTick-LastSizeTick)/1000)) . " Kb/s"
            // Mb/s로 표기하고 싶다면
            // Speed := Round((CurrentSize/1024-LastSize/1024)/((CurrentSizeTick-LastSizeTick)/1000)/1000) . " Mb/s"
            LastSizeTick := CurrentSizeTick
            LastSize := FileOpen(SaveFileAs, "r").Length
            // Round 함수는 소숫점을 반올림하는 함수입니다.
            // 현재 사이즈와 다운로드할 자료의 전체 사이즈를 나누고 100곱해서 퍼센트로 만듭니다.
            PercentDone := Round(CurrentSize/FinalSize*100)
            // 프로그레스 바에 퍼센트와 다운로드 속도 등을 표시합니다.
            Progress, %PercentDone%, %PercentDone%`% Done, Downloading...  (%Speed%), Downloading %SaveFileAs% (%PercentDone%`%)
      Return
}

Kb/s
Mb/s