본문 바로가기
IT-개발,DB

[IT/개발] 파워빌더 - wininet.dll 를 이용한 ftp 방법

by SB리치퍼슨 2010. 2. 22.


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 
 

반응형

댓글