wininet.dll 를 이용한 ftp 방법이네요
자료실에 적지 않은 소스가 올라와 있지만
wininet.dll를 이용하여 한눈에 볼수 있게 올리셨으니
더 많이 이용할 것 같네요
고맙습니다 ^^
//먼저 global external function에서 선언하시고
FUNCTION ULONG InternetConnectA (ULONG hInternetSession, STRING sServerName, INT nServerPort, STRING sUsername, STRING sPassword, ULONG lService, ULONG lFlags, ULONG lContext) LIBRARY "wininet.dll"
FUNCTION ULONG InternetOpenA (STRING sAgent, LONG lAccessTyp, STRING sProxyNam, STRING sProxyBypass, ULONG lFlags) LIBRARY "wininet.dll"
FUNCTION ULONG InternetCloseHandle (ULONG hInet) LIBRARY "wininet.dll"
FUNCTION ULONG FtpOpenFileA (ULONG hFtpSession, STRING sBuff, ULONG Access, ULONG FLAGS, ULONG Context) LIBRARY "wininet.dll"
FUNCTION ULONG FtpGetFileSize (ULONG hFile, ULONG lpdwFileSizeHigh) LIBRARY "wininet.dll"
FUNCTION ULONG InternetReadFile (ULONG hFile, REF BLOB sBuffer, ULONG lNumBytesToRead, REF LONG dwNumberOfBytesRead) LIBRARY "wininet.dll"
FUNCTION ULONG InternetWriteFile (ULONG hFile, REF BLOB sBuffer, ULONG lNumBytesToWrite, REF LONG dwNumberOfBytesWritten) LIBRARY "wininet.dll"
//다음 global variable에서 선언하세요
CONSTANT LONG ERROR_NO_MORE_FILES = 18
CONSTANT LONG BUFFERSIZE = 255
CONSTANT LONG INTERNET_FLAG_PASSIVE = 134217728
CONSTANT LONG FTP_TRANSFER_TYPE_BINARY = 2
CONSTANT LONG FTP_TRANSFER_TYPE_ASCII = 1
CONSTANT LONG GENERIC_READ = 2147483648
CONSTANT LONG GENERIC_WRITE = 1073741824
CONSTANT LONG INTERNET_OPEN_TYPE_PRECONFIG = 0
CONSTANT LONG INTERNET_SERVICE_FTP = 1
CONSTANT STRING IP="210.91.117.9"
CONSTANT INT PORT=3001
CONSTANT STRING ID="CHEIL"
CONSTANT STRING PW="NBS"
CONSTANT STRING CONNECTS="PASSIVE"
CONSTANT STRING TRANSFER="BINARY"
CONSTANT STRING SERVER="/"
CONSTANT STRING PATH="c:\erp"
CONSTANT STRING DEVICE="c:"
LONG GL_HOPEN, GL_HCONNECTION, GL_HFILE, GL_DWTYPE, GL_DWSEMAN
STRING GS_SYSID, GS_PGID, GS_EXT, GS_VER
BOOLEAN GB_CYCLE = TRUE
//다음 화일 다운로드(업로드)시에 아래의 3개의 함수를 사용하세요
//호출시 FTP를 OPEN합니다
FTPOPEN(IP, PORT, ID, PW)
//다운로드 받습니다
FTPDOWNLOAD("c:\a.txt", "/a.txt", 1000)
//FTP를 종료합니다
FTPCLOSE()
//아래는 FTPOPEN함수 부분입니다
//4개인 인수가 있는데 순서대로 string,integer,string,string type 입니다
TRY
IF GL_HCONNECTION < 0 THEN INTERNETCLOSEHANDLE(GL_HCONNECTION)
YIELD()
GL_HOPEN = INTERNETOPENA("FTP MODULE",INTERNET_OPEN_TYPE_PRECONFIG, ' ', ' ', 0)
GL_HCONNECTION = INTERNETCONNECTA(GL_HOPEN,IPS,PORTS,USER,PASSWORD,INTERNET_SERVICE_FTP,GL_DWSEMAN,0)
CATCH (RUNTIMEERROR RE)
SLE_4.TEXT = "FTP 연결오류"
END TRY
IF GL_HCONNECTION < 0 THEN RETURN TRUE
//아래는 FTPDOWNLOAD 부분입니다
//3개의 인수가 있는데 순서대로 string,string,integer 입니다
BLOB LB_DATA
LONG LL_SUM, LL_BLOCK, LL_DWREAD
INT LI_FILENUM
YIELD()
TRY
IF NOT ISNULL(LOCAL) AND NOT ISNULL(REMOTE) THEN
GL_HFILE = FTPOPENFILEA(GL_HCONNECTION, REMOTE, GENERIC_READ, GL_DWTYPE,0)
IF GL_HFILE =0 THEN
SLE_4.TEXT = "FTP 화일열기 실패 : " + GS_PGID
RETURN FALSE
END IF
SIZE = FTPGETFILESIZE(GL_HFILE,0)
IF SIZE <= 0 THEN RETURN FALSE
HPB_1.Maxposition = INT(SIZE / BUFFERSIZE)
LL_SUM = 0
YIELD()
LI_FILENUM = FILEOPEN(LOCAL, STREAMMODE!, WRITE!, LOCKWRITE!, REPLACE!)
FILESEEK(LI_FILENUM, 0, FROMBEGINNING!)
FOR LL_BLOCK = 1 TO INT(SIZE / BUFFERSIZE)
YIELD()
LB_DATA = BLOB(SPACE(BUFFERSIZE))
IF INTERNETREADFILE(GL_HFILE,LB_DATA,BUFFERSIZE,LL_DWREAD) = 0 THEN
SLE_4.TEXT = "FTP 화일읽기 실패 : " + GS_PGID
RETURN FALSE
END IF
FILEWRITE(LI_FILENUM, LB_DATA)
LL_SUM += BUFFERSIZE
HPB_1.POSITION = INT(LL_SUM / BUFFERSIZE)
NEXT
END IF
LB_DATA = BLOB(SPACE(MOD(SIZE,BUFFERSIZE)))
IF INTERNETREADFILE(GL_HFILE,LB_DATA,MOD(SIZE,BUFFERSIZE),LL_DWREAD) = 0 THEN SLE_4.TEXT = "FTP 화일읽기 실패 : " + GS_PGID
FILEWRITE(LI_FILENUM, LB_DATA)
HPB_1.POSITION = HPB_1.MAXPOSITION
YIELD()
INTERNETCLOSEHANDLE(GL_HFILE)
CATCH (RUNTIMEERROR RE)
SLE_4.TEXT = "FTP 화일전송 실패 : " + GS_PGID + GS_EXT
END TRY
FILECHECK()
SLE_3.TEXT = "전송화일 : " + GS_PGID + GS_EXT
RETURN TRUE
//여기서 ftpgetfile 함수를 사용하지 않고 internetreadfile 함수를
//사용한 이유는 프로그래스바에서 진행상황을 나타내기 위함입니다
//마지막으로 FTPCLOSE 함수부분입니다
IF GL_HCONNECTION < 0 THEN INTERNETCLOSEHANDLE(GL_HCONNECTION)
GL_HCONNECTION = 0
이정도만 하면 완변하게 구현이 되는데 single text 나 프로그래스바
컨트롤은 설치하신후에 프로그램해야 오류가 안난다는것은 말할 필요가
없겠죠..
출처: http://www.pbdn.net/board/BoardShow.aspx?board_id=2&role=qna&page=4&c_id=7663&c_seq=5&sfield=total&svalue=wininet
고맙게 잘 봤습니다.
추가... 직접 작성한 화일 업로드 루틴 추가
//아래는 FTPUPLOAD 부분입니다
//2개의 인수가 있는데 순서대로 string,string입니다
BLOB LB_DATA
LONG LL_SUM, LL_BLOCK, LL_DWWRITE , LL_SIZE
INT LI_FILENUM
YIELD()
TRY
IF NOT ISNULL(a_local) AND NOT ISNULL(a_remote) THEN
GL_HFILE = FTPOPENFILEA(GL_HCONNECTION, a_remote, GENERIC_WRITE, GL_DWTYPE,0)
IF GL_HFILE =0 THEN
MessageBox('FTP', "FTP 화일쓰기 실패 1: " + GS_PGID )
RETURN FALSE
END IF
//a_SIZE = FTPGETFILESIZE(GL_HFILE,0)
LL_SIZE = FileLength(a_local)
IF LL_SIZE <= 0 THEN
RETURN FALSE
END IF
//HPB_1.Maxposition = INT(SIZE / BUFFERSIZE)
LL_SUM = 0
YIELD()
LI_FILENUM = FILEOPEN(a_LOCAL, STREAMMODE!, READ!, LOCKWRITE!, REPLACE!)
FILESEEK(LI_FILENUM, 0, FROMBEGINNING!)
FOR LL_BLOCK = 1 TO INT(LL_SIZE / BUFFERSIZE)
YIELD()
LB_DATA = BLOB(SPACE(BUFFERSIZE))
IF INTERNETWRITEFILE(GL_HFILE,LB_DATA,BUFFERSIZE,LL_DWWRITE) = 0 THEN
MessageBox('FTP', "FTP 화일쓰기 실패 2: " + GS_PGID )
RETURN FALSE
END IF
FILEREAD(LI_FILENUM, LB_DATA)
LL_SUM += BUFFERSIZE
//HPB_1.POSITION = INT(LL_SUM / BUFFERSIZE)
NEXT
END IF
FILEREAD(LI_FILENUM, LB_DATA)
//LB_DATA = BLOB(SPACE(MOD(LL_SIZE,BUFFERSIZE)))
IF INTERNETWRITEFILE(GL_HFILE,LB_DATA,MOD(LL_SIZE,BUFFERSIZE),LL_DWWRITE) = 0 THEN
MessageBox('FTP', "FTP 화일쓰기 실패 3: " + GS_PGID )
END IF
//FILEWRITE(LI_FILENUM, LB_DATA)
//HPB_1.POSITION = HPB_1.MAXPOSITION
YIELD()
INTERNETCLOSEHANDLE(GL_HFILE)
CATCH (RUNTIMEERROR RE)
MessageBox('FTP', "FTP 화일보내기 실패 4: " + GS_PGID + GS_EXT )
END TRY
//FILECHECK()
MessageBox('FTP', "보내는화일 : " + GS_PGID + GS_EXT )
RETURN TRUE
'IT-개발,DB' 카테고리의 다른 글
[IT] MS SyncToy 하드 백업 예약 실행하기 (0) | 2010.03.02 |
---|---|
[IT] 하드디스크 백업은 SyncToy에 맡기자 (0) | 2010.02.26 |
[IT/개발] 파워빌더 - FTP 사용하기 (0) | 2010.02.22 |
[IT/개발] 파워빌더 - 에러코드 설명 (0) | 2010.02.18 |
[IT/개발] 파워빌더 - 데이타윈도우 내용을 엑셀로 내려받기 (0) | 2010.02.18 |
댓글