wIniNet API - FTP Upload, Download를 위한 VB Script

 
반응형
' ***** WININET 상수 *****
' 경로의 최대 길이
Const MAX_PATH = 260
' 오류가 없습니다.
Const NO_ERROR = 0

 

' ***** 파일 속성 상수 *****
' 읽기 전용입니다.
Const FILE_ATTRIBUTE_READONLY = &H1
' 숨김 파일입니다.
Const FILE_ATTRIBUTE_HIDDEN = &H2
' 시스템 파일입니다.
Const FILE_ATTRIBUTE_SYSTEM = &H4

' 디렉토리입니다.
Const FILE_ATTRIBUTE_DIRECTORY = &H10
' 일반적인 문서 파일입니다.
Const FILE_ATTRIBUTE_ARCHIVE = &H20
' 일반적인 파일입니다.
Const FILE_ATTRIBUTE_NORMAL = &H80
' 임시 파일입니다.
Const FILE_ATTRIBUTE_TEMPORARY = &H100
' 압축된 파일입니다.
Const FILE_ATTRIBUTE_COMPRESSED = &H800
' 오프라인 파일(캐쉬된)입니다.
Const FILE_ATTRIBUTE_OFFLINE = &H1000


' 파일의 시간을 나타내는 구조체
Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type


' 파일을 찾기 위한 구조체
Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type

 

' 더 이상 (찾을 수 있는) 파일이 없습니다.
Const ERROR_NO_MORE_FILES = 18

 

' 그 다음 파일을 찾습니다.
Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long

 

' FTP에서, 첫번째 파일을 구합니다.
Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long

 

' FTP에서, 파일을 내려받기 합니다.
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

 

' FTP에서, 파일을 업로드 합니다.
Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

 

' FTP에서, 서버상의 작업 디렉토리를 바꿉니다.
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean

 

' FTP에서, 서버상의 작업 디렉토리가 무엇인지 알아옵니다.
Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String, ByRef lpdwCurrentDirectory As Long) As Boolean



' 응용 프로그램이 Win32 인터넷 함수를 이용하기 위한 초기화

' 새로운 연결을 만들기 전에 인터넷 핸들을 생성합니다.
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

' 사용자 정의 User-Agent
Const scUserAgent = "vb wininet"

 

' ***** 프록시 관련 상수 *****
' Internet Explorer의 설정을 사용합니다.
Const INTERNET_OPEN_TYPE_PRECONFIG = 0
' 프록시 서버를 사용하지 않습니다.
Const INTERNET_OPEN_TYPE_DIRECT = 1
' 지정한 프록시 서버 설정을 사용합니다.
Const INTERNET_OPEN_TYPE_PROXY = 3

' 잘못된 포트 번호를 나타냅니다.
Const INTERNET_INVALID_PORT_NUMBER = 0

 

' ***** HTTP 세션을 여는 함수들 *****

' 지정한 곳으로 연결합니다.
Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

->> ByVal lFlags 을 134217728 으로 하면, passive FTP mode 로 접속!

' 가장 마지막으로 연결했던 곳의 응답 내용을 알아옵니다.
Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Boolean

 


' ***** 연결하고자 하는 서버의 TCP/IP 포트 번호들 *****
' FTP 포트
Const INTERNET_DEFAULT_FTP_PORT = 21
' GOPHER 포트
Const INTERNET_DEFAULT_GOPHER_PORT = 70
' HTTP 포트
Const INTERNET_DEFAULT_HTTP_PORT = 80
' HTTPS 포트(HTTP 보안 프로토콜)
Const INTERNET_DEFAULT_HTTPS_PORT = 443
' 일반적인 소켓 포트
Const INTERNET_DEFAULT_SOCKS_PORT = 1080

 

' ***** 옵션 플래그 *****

' 연결할 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_CONNECT_TIMEOUT = 2
' 전송받을 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_RECEIVE_TIMEOUT = 6
' 보낼 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_SEND_TIMEOUT = 5
' 사용자 이름을 지정합니다.
Const INTERNET_OPTION_USERNAME = 28
' 암호를 지정합니다.
Const INTERNET_OPTION_PASSWORD = 29
' 프록시 서버 사용자 이름을 지정합니다.
Const INTERNET_OPTION_PROXY_USERNAME = 43
' 프록시 서버 암호를 지정합니다.
Const INTERNET_OPTION_PROXY_PASSWORD = 44

 

' ***** 서비스 접근 방법 *****

' FTP 서비스
Const INTERNET_SERVICE_FTP = 1
' GOPHER 서비스
Const INTERNET_SERVICE_GOPHER = 2
' HTTP 서비스
Const INTERNET_SERVICE_HTTP = 3

' HTTP에서, 요청 정보를 보냅니다.
Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' 읽기 작업
Const GENERIC_READ = &H80000000
' 쓰기 작업
Const GENERIC_WRITE = &H40000000

' HTTP에서, 추가적인 요청 정보를 보냅니다.
Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Integer

' HTTP에서, 서버가 응답한 데이터를 조회합니다.
Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer


' 표준 인터넷 오류 대화상자를 띄웁니다.
Declare Function InternetErrorDlg Lib "wininet.dll" (ByVal hWnd As Long, ByVal hInternet As Long, ByVal dwError As Long, ByVal dwFlags As Long, ByVal lppvData As Long) As Long


' 인터넷 오류 대화상자 상수
Const FLAGS_ERROR_UI_FILTER_FOR_ERRORS = &H1
Const FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS = &H2
Const FLAGS_ERROR_UI_FLAGS_GENERATE_DATA = &H4
Const FLAGS_ERROR_UI_FLAGS_NO_UI = &H8
Const FLAGS_ERROR_UI_SERIALIZE_DIALOGS = &H10


' 바탕 화면 창의 핸들을 얻습니다.
Declare Function GetDesktopWindow Lib "user32.dll" () As Long


' ***** HTTP 응답 정보 상수들 *****
' 컨텐츠의 형식(Mine 타입 등)을 알아옵니다.
Const HTTP_QUERY_CONTENT_TYPE = 1
' 컨텐츠의 크기를 알아옵니다.
Const HTTP_QUERY_CONTENT_LENGTH = 5
' 컨텐츠의 만료일을 알아옵니다.
Const HTTP_QUERY_EXPIRES = 10
' 컨텐츠의 최종 수정일을 알아옵니다.
Const HTTP_QUERY_LAST_MODIFIED = 11
' 컨텐츠의 프라그마 부가 정보를 알아옵니다.
Const HTTP_QUERY_PRAGMA = 17
' 서버의 HTTP 버전을 알아옵니다.
Const HTTP_QUERY_VERSION = 18
' HTTP 상태 코드를 알아옵니다.
Const HTTP_QUERY_STATUS_CODE = 19
' HTTP 상태 내용을 알아옵니다.
Const HTTP_QUERY_STATUS_TEXT = 20
' HTTP 헤더를 알아옵니다.
Const HTTP_QUERY_RAW_HEADERS = 21
' HTTP 헤더의 줄바꿈 기준 단위를 알아옵니다.
Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
' 포워딩 되었는지를 알아옵니다.
Const HTTP_QUERY_FORWARDED = 30
' HTTP 서버 정보를 알아옵니다.
Const HTTP_QUERY_SERVER = 37
' User-Agent를 알아옵니다.
Const HTTP_QUERY_USER_AGENT = 39
' 쿠키를 설정합니다.
Const HTTP_QUERY_SET_COOKIE = 43
' 요청 방법을 알아옵니다.
Const HTTP_QUERY_REQUEST_METHOD = 45

' 요청이 거부되었습니다.
Const HTTP_STATUS_DENIED = 401
' 프록시 서버 인증이 필요합니다.
Const HTTP_STATUS_PROXY_AUTH_REQ = 407


' 가져올 헤더에 플래그로 추가하는 상수
' 헤더들을 가져옵니다.
Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
' 숫자 정보를 얻습니다.
Const HTTP_QUERY_FLAG_NUMBER = &H20000000


' HttpOpenRequest 함수로 열린 인터넷 핸들에서, 데이터를 읽습니다.
Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer


' 인터넷 버퍼 구조체 설명
'Type INTERNET_BUFFERS
'    dwStructSize As Long ' 구조체의 크기
'    Next As Long ' 다음 버퍼의 포인터; VB에서 사용 불가
'    lpcszHeader As Long ' 헤더의 포인터 (NULL 가능합니다)
'    dwHeadersLength As Long ' 헤더를 사용할 경우 헤더의 길이
'    dwHeadersTotal As Long ' 모든 헤더의 크기
'    lpvBuffer As Long ' 데이터를 받을 버퍼의 포인터(NULL 가능합니다).
'    dwBufferLength As Long ' 데이터를 받을 버퍼의 크기(필수)
'    dwBufferTotal As Long ' 모든 버퍼의 크기
'    dwOffsetLow As Long ' 읽는 크기
'    dwOffsetHigh As Long ' 읽는 크기, 64비트용
'End Type

Type INTERNET_BUFFERS
    dwStructSize As Long
    Next As Long
    lpcszHeader As Long
    dwHeadersLength As Long
    dwHeadersTotal As Long
    lpvBuffer As Long
    dwBufferLength As Long
    dwBufferTotal As Long
    dwOffsetLow As Long
    dwOffsetHigh As Long
End Type

' HTTP에서, 확장 요청 정보를 보냅니다.
Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" (ByVal hHttpRequest As Long, lpBuffersIn As INTERNET_BUFFERS, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

' HTTP에서, 요청을 종료합니다.
Declare Function HttpEndRequest Lib "wininet.dll" Alias "HttpEndRequestA" (ByVal hHttpRequest As Long, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

' 열린 인터넷 핸들에 데이터를 씁니다.
Declare Function InternetWriteFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) As Integer

' FTP에서, 파일을 엽니다.
Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFtpSession As Long, ByVal sFileName As String, ByVal lAccess As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' FTP에서, 파일을 지웁니다.
Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean

' 인터넷 핸들의 여러 가지 설정 정보를 설정합니다.
Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByVal lBufferLength As Long) As Integer

' (VB용) InternetSetOption 함수와 같으나, 설정 정보를 전달하는 인자를 문자열 형으로 따로 선언했습니다.
Declare Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer

' 인터넷 핸들을 닫습니다. 사용이 끝난 인터넷 핸들은 반드시 닫아줘야 합니다.
Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

' 인터넷 핸들로부터 설정된 여러 가지 설정 정보를 조회합니다.
Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long) As Integer


' Wininet.dll의 버전을 알아옵니다.
Const INTERNET_OPTION_VERSION = 40

' 윈도우즈 인터넷 함수(Wininet.dll)이 담고 있는 DLL의 버전 정보를 알아오는 함수.
'functions (Wininet.dll). This structure is used when passing the
' 이 구조체는 INTERNET_OPTION_VERSION 플래그를 InternetQueryOption 함수로 넘겼을 때
' 반환됩니다.
Type tWinInetDLLVersion
    lMajorVersion As Long
    lMinorVersion As Long
End Type

'Adds one or more HTTP request headers to the HTTP request handle.
' HTTP 요청 핸들에 추가적인 HTTP 요청 헤더를 추가합니다.
Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Integer

' 이 플래그는 이 함수의 의미적인 면을 바꿉니다.
' 다음의 값들을 가질 수 있습니다:

' 같은 것이 없을때만 헤더를 추가합니다. 아니면, 오류를 반환합니다.
Const HTTP_ADDREQ_FLAG_ADD_IF_NEW = &H10000000

' 헤더가 존재하지 않을때만 추가합니다. HTTP_ADDREQ_FLAG_REPLACE 플래그와 함께 사용합니다.
Const HTTP_ADDREQ_FLAG_ADD = &H20000000

' 헤더를 바꾸거나, 제거합니다. 만약 헤더 값이 비어있거나 같은 헤더가 있다면,
' 헤더를 제거합니다. 만약 비어있지 않다면, 헤더 값을 바꿉니다.
Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000



' ***** 인터넷 오류 상수 *****
' 오류 기본 값(나머지 오류 값은 이 값을 더해서 사용합니다)
Const INTERNET_ERROR_BASE = 12000
' 핸들의 범위를 벗어났습니다.
Const ERROR_INTERNET_OUT_OF_HANDLES = (INTERNET_ERROR_BASE + 1)
' 타임 아웃으로 인해 종료되었습니다.
Const ERROR_INTERNET_TIMEOUT = (INTERNET_ERROR_BASE + 2)
' 파생된 오류 입니다.
Const ERROR_INTERNET_EXTENDED_ERROR = (INTERNET_ERROR_BASE + 3)
' 내부 오류가 발생하였습니다.
Const ERROR_INTERNET_INTERNAL_ERROR = (INTERNET_ERROR_BASE + 4)
' URL이 올바르지 않습니다.
Const ERROR_INTERNET_INVALID_URL = (INTERNET_ERROR_BASE + 5)
' 인증되지 않은 스키마입니다.
Const ERROR_INTERNET_UNRECOGNIZED_SCHEME = (INTERNET_ERROR_BASE + 6)
' 호스트 이름이 고정되지 않았습니다: 호스트를 찾을 수 없습니다.
Const ERROR_INTERNET_NAME_NOT_RESOLVED = (INTERNET_ERROR_BASE + 7)
' 프로토콜을 찾을 수 없습니다: 프로토콜이 잘못 되었습니다.
Const ERROR_INTERNET_PROTOCOL_NOT_FOUND = (INTERNET_ERROR_BASE + 8)
' 설정 값이 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_OPTION = (INTERNET_ERROR_BASE + 9)
' 설정 값의 길이가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_OPTION_LENGTH = (INTERNET_ERROR_BASE + 10)
' 설정 값이 기록되지 않았습니다.
Const ERROR_INTERNET_OPTION_NOT_SETTABLE = (INTERNET_ERROR_BASE + 11)
' 셧다운 되버렸습니다: 연결이 강제로 끊겼습니다.
Const ERROR_INTERNET_SHUTDOWN = (INTERNET_ERROR_BASE + 12)
' 사용자 이름이 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_USER_NAME = (INTERNET_ERROR_BASE + 13)
' 사용자 암호가 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_PASSWORD = (INTERNET_ERROR_BASE + 14)
' 로그인을 실패 하였습니다.
Const ERROR_INTERNET_LOGIN_FAILURE = (INTERNET_ERROR_BASE + 15)
' 작업이 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_OPERATION = (INTERNET_ERROR_BASE + 16)
' 작업이 취소 되었습니다.
Const ERROR_INTERNET_OPERATION_CANCELLED = (INTERNET_ERROR_BASE + 17)
' 핸들 형식이 잘못 되었습니다.
Const ERROR_INTERNET_INCORRECT_HANDLE_TYPE = (INTERNET_ERROR_BASE + 18)
' 핸들 상태가 잘못 되었습니다.
Const ERROR_INTERNET_INCORRECT_HANDLE_STATE = (INTERNET_ERROR_BASE + 19)
' 프록시 서버의 요청이 아닙니다.
Const ERROR_INTERNET_NOT_PROXY_REQUEST = (INTERNET_ERROR_BASE + 20)
' 레지스트리 값을 찾을 수 없습니다.
Const ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND = (INTERNET_ERROR_BASE + 21)
' 레지스트리 매개 변수가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_REGISTRY_PARAMETER = (INTERNET_ERROR_BASE + 22)
' 직접 접근을 할 수 없습니다.
Const ERROR_INTERNET_NO_DIRECT_ACCESS = (INTERNET_ERROR_BASE + 23)
' 컨텍스트를 얻을 수 없습니다.
Const ERROR_INTERNET_NO_CONTEXT = (INTERNET_ERROR_BASE + 24)
' 콜백 함수 설정에 실패하였습니다.
Const ERROR_INTERNET_NO_CALLBACK = (INTERNET_ERROR_BASE + 25)
' 요청이 중복 실행되어 지연되고 있습니다.
Const ERROR_INTERNET_REQUEST_PENDING = (INTERNET_ERROR_BASE + 26)
' 형식이 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_FORMAT = (INTERNET_ERROR_BASE + 27)
' 항목을 찾을 수 없습니다.
Const ERROR_INTERNET_ITEM_NOT_FOUND = (INTERNET_ERROR_BASE + 28)
' 연결할 수 없습니다.
Const ERROR_INTERNET_CANNOT_CONNECT = (INTERNET_ERROR_BASE + 29)
' 연결이 강제로 종료 되었습니다.
Const ERROR_INTERNET_CONNECTION_ABORTED = (INTERNET_ERROR_BASE + 30)
' 연결이 초기화 되었습니다.
Const ERROR_INTERNET_CONNECTION_RESET = (INTERNET_ERROR_BASE + 31)
' 강제로 다시 시도 합니다.
Const ERROR_INTERNET_FORCE_RETRY = (INTERNET_ERROR_BASE + 32)
' 잘못된 프록시 서버 요청입니다.
Const ERROR_INTERNET_INVALID_PROXY_REQUEST = (INTERNET_ERROR_BASE + 33)
' UI가 필요합니다.
Const ERROR_INTERNET_NEED_UI = (INTERNET_ERROR_BASE + 34)
' 핸들이 존재합니다.
Const ERROR_INTERNET_HANDLE_EXISTS = (INTERNET_ERROR_BASE + 36)
' 인증서의 날짜가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_CERT_DATE_INVALID = (INTERNET_ERROR_BASE + 37)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_CERT_CN_INVALID = (INTERNET_ERROR_BASE + 38)
' HTTP 에서 HTTPS로 재연결 됩니다.
Const ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR = (INTERNET_ERROR_BASE + 39)
' HTTPS 에서 HTTP로 재연결 됩니다.
Const ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR = (INTERNET_ERROR_BASE + 40)
' 보안 모드와 일반 모드가 섞여있습니다.
Const ERROR_INTERNET_MIXED_SECURITY = (INTERNET_ERROR_BASE + 41)
' 보안 되지 않은 CHG 폼 입니다.
Const ERROR_INTERNET_CHG_POST_IS_NON_SECURE = (INTERNET_ERROR_BASE + 42)
' 보안 되지 않은 폼 입니다.
Const ERROR_INTERNET_POST_IS_NON_SECURE = (INTERNET_ERROR_BASE + 43)
' 클라이언트의 인증서가 필요합니다.
Const ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED = (INTERNET_ERROR_BASE + 44)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_CA = (INTERNET_ERROR_BASE + 45)
' 클라이언트에 인증서가 설치되지 않았습니다.
Const ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP = (INTERNET_ERROR_BASE + 46)
' 비동기 쓰레드 생성에 실패 하였습니다.
Const ERROR_INTERNET_ASYNC_THREAD_FAILED = (INTERNET_ERROR_BASE + 47)
' 재연결 스키마가 변경 되었습니다.
Const ERROR_INTERNET_REDIRECT_SCHEME_CHANGE = (INTERNET_ERROR_BASE + 48)
' 대화 상자가 지연되고 있습니다.
Const ERROR_INTERNET_DIALOG_PENDING = (INTERNET_ERROR_BASE + 49)
' 재시도 대화 상자
Const ERROR_INTERNET_RETRY_DIALOG = (INTERNET_ERROR_BASE + 50)
' HTTPS 에서 HTTP로 재연결 하면서 전송합니다.
Const ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR = (INTERNET_ERROR_BASE + 52)
' CD-ROM을 삽입해 주세요.
Const ERROR_INTERNET_INSERT_CDROM = (INTERNET_ERROR_BASE + 53)


' ***** FTP 오류 상수 *****
' 이미 전송 작업이 진행중 입니다.
Const ERROR_FTP_TRANSFER_IN_PROGRESS = (INTERNET_ERROR_BASE + 110)
' FTP 연결이 다운 되었습니다.
Const ERROR_FTP_DROPPED = (INTERNET_ERROR_BASE + 111)
' Passive 모드가 아닙니다.
Const ERROR_FTP_NO_PASSIVE_MODE = (INTERNET_ERROR_BASE + 112)

' ***** Gopher 오류 상수 *****
' Gopher 프로토콜 오류입니다.
Const ERROR_GOPHER_PROTOCOL_ERROR = (INTERNET_ERROR_BASE + 130)
' 파일이 아닙니다.
Const ERROR_GOPHER_NOT_FILE = (INTERNET_ERROR_BASE + 131)
' 데이터 오류입니다.
Const ERROR_GOPHER_DATA_ERROR = (INTERNET_ERROR_BASE + 132)
' 데이터의 끝입니다.
Const ERROR_GOPHER_END_OF_DATA = (INTERNET_ERROR_BASE + 133)
' 로케이터가 잘못 되었습니다.
Const ERROR_GOPHER_INVALID_LOCATOR = (INTERNET_ERROR_BASE + 134)
' 로케이터 형식이 잘못 되었습니다.
Const ERROR_GOPHER_INCORRECT_LOCATOR_TYPE = (INTERNET_ERROR_BASE + 135)
' Gopher+ 가 아닙니다.
Const ERROR_GOPHER_NOT_GOPHER_PLUS = (INTERNET_ERROR_BASE + 136)
' 속성을 찾을 수 없습니다.
Const ERROR_GOPHER_ATTRIBUTE_NOT_FOUND = (INTERNET_ERROR_BASE + 137)
' 로케이터를 알 수 없습니다.
Const ERROR_GOPHER_UNKNOWN_LOCATOR = (INTERNET_ERROR_BASE + 138)

' ***** HTTP 오류 상수 *****
' 헤더가 존재하지 않습니다.
Const ERROR_HTTP_HEADER_NOT_FOUND = (INTERNET_ERROR_BASE + 150)
' 서버가 다운 된 것 같습니다.
Const ERROR_HTTP_DOWNLEVEL_SERVER = (INTERNET_ERROR_BASE + 151)
' 서버 응답이 잘못 되었습니다.
Const ERROR_HTTP_INVALID_SERVER_RESPONSE = (INTERNET_ERROR_BASE + 152)
' 헤더가 잘못 되었습니다.
Const ERROR_HTTP_INVALID_HEADER = (INTERNET_ERROR_BASE + 153)
' 요청의 조회가 잘못 되었습니다.
Const ERROR_HTTP_INVALID_QUERY_REQUEST = (INTERNET_ERROR_BASE + 154)
' 헤더가 이미 존재합니다.
Const ERROR_HTTP_HEADER_ALREADY_EXISTS = (INTERNET_ERROR_BASE + 155)
' 재연결에 실패 하였습니다.
Const ERROR_HTTP_REDIRECT_FAILED = (INTERNET_ERROR_BASE + 156)
' 재연결 되지 않았습니다.
Const ERROR_HTTP_NOT_REDIRECTED = (INTERNET_ERROR_BASE + 160)
' 쿠키 확인이 필요합니다.
Const ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION = (INTERNET_ERROR_BASE + 161)
' 쿠기가 거부 되었습니다.
Const ERROR_HTTP_COOKIE_DECLINED = (INTERNET_ERROR_BASE + 162)
' 재연결 확인이 필요합니다.
Const ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION = (INTERNET_ERROR_BASE + 168)

' ***** 추가 인터넷 오류 상수 *****
' 보안 채널에 오류가 발생 하였습니다.
Const ERROR_INTERNET_SECURITY_CHANNEL_ERROR = (INTERNET_ERROR_BASE + 157)
' 캐쉬 파일을 사용할 수 없습니다.
Const ERROR_INTERNET_UNABLE_TO_CACHE_FILE = (INTERNET_ERROR_BASE + 158)
' TCP/IP가 설치되지 않았습니다.
Const ERROR_INTERNET_TCPIP_NOT_INSTALLED = (INTERNET_ERROR_BASE + 159)
' 연결이 끊겼습니다.
Const ERROR_INTERNET_DISCONNECTED = (INTERNET_ERROR_BASE + 163)
' 데이터가 서버에 도달할 수 없습니다.
Const ERROR_INTERNET_SERVER_UNREACHABLE = (INTERNET_ERROR_BASE + 164)
' 데이터가 프록시 서버에 도달할 수 없습니다.
Const ERROR_INTERNET_PROXY_SERVER_UNREACHABLE = (INTERNET_ERROR_BASE + 165)
' 프록시 자동 구성 스크립트가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT = (INTERNET_ERROR_BASE + 166)
' 내려받기 스크립트를 사용할 수 없습니다.
Const ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT = (INTERNET_ERROR_BASE + 167)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_INVALID_CERT = (INTERNET_ERROR_BASE + 169)
' 인증서가 만기 되었습니다.
Const ERROR_INTERNET_SEC_CERT_REVOKED = (INTERNET_ERROR_BASE + 170)

' 보안 만기일 검사에 실패 하였습니다.
Const ERROR_INTERNET_FAILED_DUETOSECURITYCHECK = (INTERNET_ERROR_BASE + 171)
' 가장 마지막 오류
Const INTERNET_ERROR_LAST = ERROR_INTERNET_FAILED_DUETOSECURITYCHECK

' 공통 열기 상수 (InternetOpen 함수에 쓰이는 것이 아닙니다):
' 새로 고칩니다.
Const INTERNET_FLAG_RELOAD = &H80000000

' ***** InternetOpenUrl의 상수 *****
' 전체 데이터를 엽니다.
Const INTERNET_FLAG_RAW_DATA = &H40000000
' 이미 연결이 존재합니다.
Const INTERNET_FLAG_EXISTING_CONNECT = &H20000000

' ***** InternetOpen의 상수 *****
' 동기화 합니다.
Const INTERNET_FLAG_ASYNC = &H10000000

' *** FTP 프로토콜의 상수 ***
' Passive 모드를 사용합니다.
Const INTERNET_FLAG_PASSIVE = &H8000000

' ***** 추가적인 캐쉬 상수 *****
' 캐쉬에 쓰지 않습니다.
Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000
' 캐쉬 하지 않습니다.
Const INTERNET_FLAG_DONT_CACHE = INTERNET_FLAG_NO_CACHE_WRITE
' 권한을 만듭니다.
Const INTERNET_FLAG_MAKE_PERSISTENT = &H2000000
' 캐쉬로부터 읽습니다.
Const INTERNET_FLAG_FROM_CACHE = &H1000000
' 오프라인 파일로부터 읽습니다.
Const INTERNET_FLAG_OFFLINE = INTERNET_FLAG_FROM_CACHE

' ***** 추가적인 플래그 *****
' 보안 연결을 사용합니다.
Const INTERNET_FLAG_SECURE = &H800000
' 연결을 유지하도록 합니다.
Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
' 자동으로 재연결하지 않습니다.
Const INTERNET_FLAG_NO_AUTO_REDIRECT = &H200000
' 읽기 전에 미리 읽습니다.
Const INTERNET_FLAG_READ_PREFETCH = &H100000
' 쿠키를 사용하지 않습니다.
Const INTERNET_FLAG_NO_COOKIES = &H80000
' 인증을 사용하지 않습니다.
Const INTERNET_FLAG_NO_AUTH = &H40000
' 인터넷에서 자료를 가져올 수 없을 때 캐쉬에서 읽습니다.
Const INTERNET_FLAG_CACHE_IF_NET_FAIL = &H10000

' 보안 무시 상수, HttpOpenRequest 에서 파생된
' 다음 형식의 보안 채널(SSL/PCT)을 무시합니다.
' HTTP로 재연결 하는 것을 무시합니다.
Const INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP = &H8000
' HTTPS로 재연결 하는 것을 무시합니다.
Const INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS = &H4000
' 인증서 기한이 만료됨을 무시합니다.
Const INTERNET_FLAG_IGNORE_CERT_DATE_INVALID = &H2000
' 인증서가 잘못됨을 무시합니다.
Const INTERNET_FLAG_IGNORE_CERT_CN_INVALID = &H1000

' ***** 그 밖에 캐쉬 상수 *****
' 다시 동기화 합니다: 캐쉬를 최신 내용으로 고칩니다.
Const INTERNET_FLAG_RESYNCHRONIZE = &H800
' 하이퍼링크를 사용합니다.
Const INTERNET_FLAG_HYPERLINK = &H400
' UI를 사용하지 않습니다.
Const INTERNET_FLAG_NO_UI = &H200
' 프라그마 부가 정보의 캐쉬를 사용하지 않습니다.
Const INTERNET_FLAG_PRAGMA_NOCACHE = &H100
' 비동기 캐쉬를 사용합니다.
Const INTERNET_FLAG_CACHE_ASYNC = &H80
' 폼을 전송합니다.
Const INTERNET_FLAG_FORMS_SUBMIT = &H40
' 파일이 필요합니다.
Const INTERNET_FLAG_NEED_FILE = &H10
' 캐쉬를 요청해야 합니다.
Const INTERNET_FLAG_MUST_CACHE_REQUEST = INTERNET_FLAG_NEED_FILE

' *** FTP 상수 ***
' 아스키 모드로 전송합니다: 텍스트 파일을 전송할 때
Const INTERNET_FLAG_TRANSFER_ASCII = &H1
' 바이너리 모드로 전송합니다: 이진 데이터를 가진 일반적인 파일을 전송할 때
Const INTERNET_FLAG_TRANSFER_BINARY = &H2

' 보안 마스크
Const INTERNET_SECURITY_MASK = INTERNET_FLAG_IGNORE_CERT_CN_INVALID Or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID Or INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS Or INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
' 인터넷 마스크
Const INTERNET_FLAGS_MASK = INTERNET_FLAG_RELOAD Or INTERNET_FLAG_RAW_DATA Or INTERNET_FLAG_EXISTING_CONNECT Or INTERNET_FLAG_ASYNC Or INTERNET_FLAG_PASSIVE Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_MAKE_PERSISTENT Or INTERNET_FLAG_FROM_CACHE Or INTERNET_FLAG_SECURE Or INTERNET_FLAG_KEEP_CONNECTION Or INTERNET_FLAG_NO_AUTO_REDIRECT Or INTERNET_FLAG_READ_PREFETCH Or INTERNET_FLAG_NO_COOKIES Or INTERNET_FLAG_NO_AUTH Or INTERNET_FLAG_CACHE_IF_NET_FAIL Or SECURITY_INTERNET_MASK Or INTERNET_FLAG_RESYNCHRONIZE Or INTERNET_FLAG_HYPERLINK Or INTERNET_FLAG_NO_UI Or INTERNET_FLAG_PRAGMA_NOCACHE Or INTERNET_FLAG_CACHE_ASYNC Or INTERNET_FLAG_FORMS_SUBMIT Or INTERNET_FLAG_NEED_FILE Or INTERNET_FLAG_TRANSFER_BINARY Or INTERNET_FLAG_TRANSFER_ASCII
' CD-ROM을 넣어야 하는 오류 마스크
Const INTERNET_ERROR_MASK_INSERT_CDROM = &H1
' 설정 마스크
Const INTERNET_OPTIONS_MASK = (Not INTERNET_FLAGS_MASK)

' ***** API 공통 상수 (새 API) *****
' 동기화 하지 않습니다.
Const WININET_API_FLAG_ASYNC = &H1
' 동기화 합니다.
Const WININET_API_FLAG_SYNC = &H4
' 컨텍스트를 사용합니다.
Const WININET_API_FLAG_USE_CONTEXT = &H8

' INTERNET_NO_CALLBACK - 이 값을 dwContext 매개 변수에 넣으면
' API는 콜백 함수를 만들지 않습니다.
Const INTERNET_NO_CALLBACK = 0

' FTP 파일 구조체
' 파일 이름과 디렉토리인지 여부를 알려 준다.
Type tFtpFile
    filename As String
    isDirectory As Boolean
End Type

' FTP 전송 형식 상수: 아스키 모드, 바이너리 모드
Enum eFtpTransferType
    FTP_TRANSFER_TYPE_ASCII = &H1
    FTP_TRANSFER_TYPE_BINARY = &H0
End Enum

' ***** 유틸리티 함수 *****

fileInfo As tFtpFile

Function MMgetDirectory(hostname As String, directory As String, ByRef fileInfo() As tFtpFile, ByRef fileCount As Integer, Optional searchPattern As String = "*", Optional username As String = "UMMC", Optional password As String = "ummc") As Boolean
   Dim hInternet As Long
   Dim hFTP As Long
   Dim hFind As Long
   Dim findfile As WIN32_FIND_DATA
   Dim flags As Long
   Dim content As Long
   Dim Count As Integer
   Dim ret As Long
   Dim startingPoint As Integer
   Dim startingPoint2 As Integer
   ReDim fileInfo(1 To 1024)
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, 0, 0)
   Call FtpSetCurrentDirectory(hFTP, directory)
   hFind = FtpFindFirstFile(hFTP, searchPattern, findfile, flags, content)


   If hFind = 0 Then
       ReDim fileInfo(0 To 0)
       MMgetDirectory = False
       fileCount = 0
       Exit Function
   End If
   Count = 1
   fileInfo(Count).filename = Trim(Mid(findfile.cFileName, 1, InStr(1, findfile.cFileName, Chr(0), vbTextCompare) - 1))


   If findfile.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY Then
       fileInfo(Count).isDirectory = True
   Else
       fileInfo(Count).isDirectory = False
   End If
   ret = 1


   Do While ret <> 0
       ret = InternetFindNextFile(hFind, findfile)


       If ret <> 0 Then
           Count = Count + 1
           fileInfo(Count).filename = Trim(Mid(findfile.cFileName, 1, InStr(1, findfile.cFileName, Chr(0), vbTextCompare) - 1))


           If findfile.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY Then
               fileInfo(Count).isDirectory = True
           Else
               fileInfo(Count).isDirectory = False
           End If
       End If
   Loop
   fileCount = Count
   Call InternetCloseHandle(hInternet)
   MMgetDirectory = True
End Function


Function MMgetFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String, localFilename As String, Optional DeleteHost As Boolean = False, Optional TransferMode As eFtpTransferType = FTP_TRANSFER_TYPE_ASCII) As Long
   Dim hInternet As Long
   Dim hFTP As Long
   Dim DeleteSuccess As Boolean
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMgetFtpFile = FtpGetFile(hFTP, HostFilename, localFilename, False, 0, INTERNET_FLAG_DONT_CACHE + TransferMode, 0)


   If DeleteHost = True Then
       DeleteSuccess = FtpDeleteFile(hFTP, HostFilename)
   End If
   Call InternetCloseHandle(hInternet)
End Function


Function MMputFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String, localFilename As String, Optional TransferMode As eFtpTransferType = FTP_TRANSFER_TYPE_ASCII) As Long
   Dim hInternet As Long
   Dim hFTP As Long
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMputFtpFile = FtpPutFile(hFTP, localFilename, HostFilename, INTERNET_FLAG_DONT_CACHE + TransferMode, 0)
   Call InternetCloseHandle(hInternet)
End Function


Function MMdeleteFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String) As Boolean
   Dim hInternet As Long
   Dim hFTP As Long
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMdeleteFtpFile = FtpDeleteFile(hFTP, HostFilename)
   Call InternetCloseHandle(hInternet)
End Function


Function MMtouchFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String) As Boolean
   Dim localFilename As String
   localFilename = "C:\Touchfile.txt"
   Open localFilename For Output As #1
   Print #1, ""
   Close #1


   If PutFtpFile(hostname, username, UserPassword, HostFilename, localFilename, FTP_TRANSFER_TYPE_ASCII) = 1 Then
       MMtouchFtpFile = True
   Else
       MMtouchFtpFile = False
   End If
   Kill localFilename
End Function

 
반응형