프로그래밍/C++
Wininet을 이용한 URL 파일 다운로드
성야
2013. 4. 24. 09:47
1. 개요
프로그래밍 작업을 하다보면 대개 정보를 제공해 주는 서버를 통해 파일을 가져와 파싱해 사용하는 경우가 존재한다.(예를 들어 기상청의 기상정보 xml 파일을 가져온다는 등)
이를 위해 실제 파일을 가져 올 수 있는 함수가 존재하여 포스팅 해보도록 하겠다.
2. 소스
HINTERNET m_hInternet, m_hURL; // URL 파일 다운에 필요한 핸들 DWORD dwValue = 10000; HANDLE hFile; // 다운 받은 파일 저장 핸들 DWORD dwSize = 0, dwRead = 0, dwWritten = 0; // Set Internet Open m_hInternet = InternetOpen ("AZITROAPPDOWN", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); // Open Option InternetSetOption (m_hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwValue, sizeof(dwValue)); InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue)); InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_SEND_TIMEOUT, &dwValue, sizeof(dwValue)); InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwValue, sizeof(dwValue)); InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue)); // URL Open m_hURL= InternetOpenUrl (m_hInternet, "파일을 다운 받을 URL 주소", NULL, 0, INTERNET_FLAG_RELOAD, 0); // URL Open 실패를 방지 하기 위한 루틴 TCHAR *szStatusCode = (TCHAR*)malloc(10000); DWORD dwInfoSize = sizeof(szStatusCode); HttpQueryInfo(m_hURL, HTTP_QUERY_STATUS_CODE, szStatusCode, &dwInfoSize, NULL); long nStatusCode = _ttol(szStatusCode); if(nStatusCode == HTTP_STATUS_OK) { // 다운 받은 파일을 저장할 파일 생성 hFile = CreateFile (szAlertPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); InternetQueryDataAvailable (m_hURL, &dwSize, 0, 0); // 파일로 저장할 버퍼 크기 알아냄 InternetReadFile (m_hURL, pDownBuf, dwSize, &dwRead); // 알아낸 크기 만큼 읽기(dwRead는 실제 읽은 크기) WriteFile (hFile, pDownBuf, dwRead, &dwWritten, NULL); // 읽은 크기만큼 저장 } // 사용이 끝난 핸들 비우기 InternetCloseHandle (m_hURL); m_hURL = NULL; InternetCloseHandle (m_hInternet); m_hInternet = NULL;
3. 이슈
한글 URL 인식 이슈 : http://blog.naver.com/sin_01/70147909216 참조