¹Ù. FTP ¿­±â

FTP ¿­±â ´ëÈ­»óÀÚ´Â FTP·ÎºÎÅÍ ´ë»ó ÆÄÀÏÀÇ À̸§À» Á¶»çÇÒ »ÓÀÌÁö Á÷Á¢ ÆÄÀÏÀ» ¿©´Â °ÍÀº ¾Æ´Ï´Ù. FTP ÆÄÀÏÀº ÀÌ ´ëÈ­»óÀÚ¿¡¼­»Ó¸¸ ¾Æ´Ï¶ó MRU³ª ÇÁ·ÎÁ§Æ®¿¡¼­µµ ¿­ ¼ö ÀÖ¾î¾ß ÇϹǷΠ°á±¹Àº OpenFromFile ÇÔ¼ö¿¡ ÀÇÇØ ¿­·Á¾ß ÇÑ´Ù. ´Ü¼øÈ÷ ÆÄÀÏÀÇ À̸§À» ¾ò´Âµ¥ Àú·¸°Ô ¸¹Àº Äڵ尡 ÇÊ¿äÇÑ ÀÌÀ¯´Â FTP ¼­¹öÀÇ Æú´õ ±¸Á¶¸¦ º¸¿©ÁÖ°í Æú´õ¸¦ ¹Ù²Ü ¼ö ÀÖµµ·Ï ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.

ÀÌ ´ëÈ­»óÀÚÀÇ °á°ú¹°Àº °á±¹ ÆĶó¹ÌÅÍ·Î ¸®ÅϵǴ ¿ø°ÝÁöÀÇ ÆÄÀÏ °æ·Î»ÓÀÌ´Ù. ÀÌ °æ·Î´Â ´ÙÀ½ Çü½ÄÀ¸·Î ÀÛ¼ºµÇ´Âµ¥ °æ·Î¸í¿¡ Á¢¼ÓÁ¤º¸¿Í ÆÄÀÏÀÇ À§Ä¡, ÆÄÀÏÀÇ À̸§±îÁö ¿Ïº®ÇÑ Á¤º¸°¡ Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é FTP ÆÄÀÏÀ» ¿­ ¶§¸¶´Ù Á¢¼ÓÁ¤º¸¸¦ ¹°¾î¾ß ÇÒ °ÍÀ̸ç ÀÏ°üµÈ ¹æ¹ýÀ¸·Î ÆÄÀÏ ÀÔÃâ·ÂÀ» ÇÒ ¼ö°¡ ¾ø´Ù.

 

ftp://»ç¿ëÀÚ¸í:ºñ¹Ð¹øÈ£:¼­¹ö:Æ÷Æ®/Æú´õ/ÆÄÀÏ

 

´ç±ÙÀÌ Á¤ÀÇÇÏ´Â ÀÌ °æ·Î Æ÷¸ËÀº Ç¥ÁØÈ­µÈ FTP °æ·Î ÁöÁ¤¹ýÀº ¾Æ´Ï¸ç µ¶ÀÚÀûÀ¸·Î Á¤ÀÇÇÑ °ÍÀÌ´Ù. »ç½Ç FTP °æ·Î¸¦ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÌ ÀÖ±â´Â ÇÏÁö¸¸ ´ç±ÙÀÇ °æ¿ì¿Í´Â ¸ÂÁö ¾Ê´Â °Í °°¾Æ °íÀ¯ÀÇ °æ·Î Ç¥Çö¹ýÀ» ¸¸µé¾ú´Ù. ¾îÂ÷ÇÇ ´ç±ÙÀÌ ¸¸µç °æ·ÎÀÌ°í ´ç±Ù¸¸ »ç¿ëÇϹǷΠǥÁØÀÌ ¾Æ´Ï¶óµµ Å« »ó°üÀº ¾ø´Ù.

OnCommand¿¡¼­´Â FTP ¿­±â ´ëÈ­»óÀÚ¸¦ È£ÃâÇ쵂 ÆĶó¹ÌÅÍ·Î ¹®ÀÚ¿­ ¹öÆÛ¸¦ Á¦°øÇϸç ÀÌ ¹öÆÛ¿¡ »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ FTP ÆÄÀÏÀÇ °æ·Î°¡ ¸®ÅϵȴÙ. ÀÌ °æ·Î¸¦ OpenFromFile ÇÔ¼ö·Î ³Ñ°ÜÁֱ⸸ ÇÏ¸é »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ÆÄÀÏÀ» Áï½Ã ¿­ ¼ö ÀÖ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_FILE_FTPOPEN:

          if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTP),

              g_hFrameWnd, DGFtpProc,(LPARAM)Path)==IDOK) {

              if (lstrlen(Path)) {

                   OpenFromFile(Path);

              }

          }

          break;

 

OpenFileToChild ÇÔ¼ö´Â FTP ÆÄÀÏÀ» ´Ù·ê ¼ö ÀÖµµ·Ï ´ÙÀ½°ú °°ÀÌ ±â´ÉÀÌ È®ÀåµÈ´Ù.

 

BOOL OpenFileToChild(HWND hChild, TCHAR *Path)

{

     ....

     if (strnicmp(Path,"http",4) == 0) {

          dwSize=DgHttpDown(Path,TextBuf);

          if (dwSize==-1) {

              return FALSE;

          }

    } else if (strnicmp(Path,"ftp",3) == 0) {

        dwSize=DgFtpDown(Path,TextBuf);

        if (dwSize==-1) {

           return FALSE;

        }

     } else {

 

ÆÄÀϸíÀÇ ¾Õ 3ÀÚ°¡ ftp·Î ½ÃÀ۵Ǹé FTP ÆÄÀÏ·Î ÀνÄÇÏ°í DgFtpDown ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÆÄÀÏÀ» ´Ù¿î·Îµå¹Þµµ·Ï ÇÑ´Ù. HTTP·Î ÆÄÀÏÀ» ´Ù¿î·Îµå¹Þ´Â °úÁ¤°ú À¯»çÇ쵂 ´Ù¿î·Îµå¸¦ ¹Þ¾ÆÁÖ´Â ÇÔ¼ö¸¸ ´Þ¶óÁ³À» »ÓÀÌ´Ù.

ÀÌÁ¦ ´ÙÀ½ ÇÒ ÀÏÀº FTP ´Ù¿î·Îµå ÇÔ¼öÀÎ DgFtpDown ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â ÀÏÀε¥ ±× Àü¿¡ FTP °æ·Î·ÎºÎÅÍ FTP Á¢¼ÓÁ¤º¸¸¦ ÃßÃâÇØ ³»´Â ÇÔ¼ö¸¦ ¸ÕÀú ¸¸µé¾î¾ß ÇÑ´Ù. WinInet ¶óÀ̺귯¸®°¡ ´ç±ÙÀÌ Á¤ÀÇÇÏ°í ÀÖ´Â FTP °æ·Î Æ÷¸ËÀ» ÀÌÇØÇÏÁö ¸øÇϱ⠶§¹®¿¡ ÀÏ´Ü Á¢¼ÓÁ¤º¸¸¦ ÃßÃâÇÏ¿© Á¢¼ÓÇÑ ÈÄ Æú´õ °æ·Î¸¦ ã¾Æ°¡¼­ ÆÄÀÏÀ» Àоî¿Í¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÇÁ·ÎÁ§Æ® Àüü¿¡ °ÉÃÄ »ç¿ëµÇ¹Ç·Î Util.cpp¿¡ ÀÛ¼ºÇÑ´Ù.

 

void ParseFtpInfo(TCHAR *Path, TCHAR *Server, TCHAR *User, TCHAR *Pass, TCHAR *& File, int &Port)

{

     TCHAR *p,*p2;

 

     p=Path+6;

     p2=strchr(p,¡¯:¡¯);

     lstrcpyn(User,p,p2-p+1);

 

     p=p2+1;

     p2=strchr(p,¡¯:¡¯);

     lstrcpyn(Pass,p,p2-p+1);

 

     p=p2+1;

     p2=strchr(p,¡¯:¡¯);

     lstrcpyn(Server,p,p2-p+1);

 

     Port=atoi(p2+1);

 

     File=strchr(p2+1,¡¯/¡¯)+1;

}

 

Path¿¡¼­ ÄÝ·ÐÀ¸·Î ±¸ºÐµÈ °¢°¢ÀÇ ÅäÅ«À» ºÐ¸®ÇÏ¿© ¼­¹ö ÁÖ¼Ò, »ç¿ëÀÚ ID, ºñ¹Ð¹øÈ£ Æ÷Æ® ¹øÈ£¸¦ ÃßÃâÇÑ´Ù. ´ÙÀ½Àº ÀÌ Á¤º¸¸¦ »ç¿ëÇÏ¿© FTP ¼­¹ö¿¡ Á¢¼ÓÇÏ°í ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ ´Ù¿î·Îµå¹Þ´Â DgFtpDown ÇÔ¼öÀÌ´Ù.

 

 

int DgFtpDown(TCHAR *Path, TCHAR *&Text)

{

     HINTERNET hRemote;

     DWORD FileSize,Size;

     DWORD dwRead;

     BOOL Result=FALSE;

     TCHAR Server[256];

     TCHAR User[32];

     TCHAR Pass[32];

     TCHAR Dir[MAX_PATH];

     int Port;

     TCHAR *p,*p2;

     MSG msg;

     TCHAR Mes[400];

     HWND hDlgDown;

 

     bContDown=TRUE;

     hDlgDown=CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_DOWNLOAD),

          g_hFrameWnd, (DLGPROC)DGDownProc);

     SetDlgItemText(hDlgDown,IDC_STDOWN1,"ÀÎÅÍ³Ý Á¢¼ÓÁß...");

     SetWindowText(hDlgDown,"FTP ´Ù¿î·Îµå");

     ShowWindow(hDlgDown,SW_SHOW);

     UpdateWindow(hDlgDown);

     EnableWindow(g_hFrameWnd, FALSE);

 

     ParseFtpInfo(Path,Server,User,Pass,p,Port);

     if (DgFtpConnect(Server,User,Pass,Port)==FALSE) {

          MessageBox(g_hFrameWnd, "FTP ´Ù¿î·Îµå¸¦ À§ÇØ ÀÎÅͳݿ¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

          goto NetFail;

     }

 

     for (;;) {

          p2=strchr(p,¡¯/¡¯);

          if (p2==NULL) {

              break;

          }

          lstrcpyn(Dir,p,p2-p+1);

          if (FtpSetCurrentDirectory(hFtp,Dir)==FALSE) {

              MessageBox(g_hFrameWnd,"FTP ¼­¹ö¿¡¼­ Æú´õ¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

              goto EndDown;

          }

          p=p2+1;

     }

 

     WIN32_FIND_DATA wfd;

     HINTERNET hFind;

     hFind=FtpFindFirstFile(hFtp,p,&wfd,0,0);

     if (hFind==NULL) {

          goto EndDown;

     }

     FileSize=wfd.nFileSizeLow;

     InternetCloseHandle(hFind);

 

     hRemote=FtpOpenFile(hFtp,p,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0);

     if (hRemote == NULL) {

          MessageBox(g_hFrameWnd,"FTP ¼­¹ö¿¡¼­ ÆÄÀÏÀ» ãÀ» ¼ö ¾ø°Å³ª ±ÇÇÑÀÌ ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

          goto EndDown;

     }

 

     if (FileSize > 1048576 * 30) {

          MessageBox(g_hFrameWnd,"FTP·Î´Â ÃÖ´ë 30M±îÁö¸¸ ¿­ ¼ö ÀÖ½À´Ï´Ù.","¾Ë¸²",MB_OK);

          goto EndDown;

     }

 

     wsprintf(Mes,"À§Ä¡ : %s",Path);

     SetDlgItemText(hDlgDown,IDC_STDOWN1,Mes);

 

     Text=(TCHAR *)malloc(FileSize+2);

     memset(Text,0,FileSize+2);

     p=Text;

 

     for (;;) {

          InternetQueryDataAvailable(hRemote,&Size,0,0);

          Result=InternetReadFile(hRemote,p,Size,&dwRead);

          if (Result==FALSE) {

              MessageBox(g_hFrameWnd, "FTP ¼­¹öÀÇ ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

              break;

          }

          if (bContDown==FALSE) {

              break;

          }

          if (dwRead==0) {

              break;

          }

          p+=dwRead;

          SendMessage(hDlgDown,WM_USER+1,(WPARAM)(p-Text),(LPARAM)FileSize);

          while (PeekMessage(&msg, NULL,0,0,PM_REMOVE)) {

              if (!IsDialogMessage(hDlgDown, &msg)) {

                   TranslateMessage(&msg);

                   DispatchMessage(&msg);

              }

          }

     }

 

EndDown:

     DgFtpUnConnect();

NetFail:

     EnableWindow(g_hFrameWnd, TRUE);

     DestroyWindow(hDlgDown);

     if (Result == TRUE && bContDown == TRUE) {

          return FileSize;

     } else {

          return -1;

     }

}

 

ÀüüÀûÀÎ ±¸Á¶´Â DgHttpDown ÇÔ¼ö¿Í À¯»çÇÏ¸ç ¹öÆÛ¸¦ °ü¸®ÇÏ´Â ¹æ¹ýµµ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ Á¢¼ÓÇÏ´Â ¼­¹ö°¡ HTTP ¼­¹ö°¡ ¾Æ´Ñ FTP ¼­¹ö¶ó´Â Á¡¸¸ ´Ù¸£´Ù. È£ÃâÃø¿¡¼­ ÆÄÀÏÀÇ Å©±â¸¦ ¸ð¸£±â ¶§¹®¿¡ ÀÌ ÇÔ¼ö°¡ ÆÄÀÏÀÇ Å©±â¸¸Å­ ¹öÆÛ¸¦ ÇÒ´çÇÏ¸ç ±×·¡¼­ TextÀμö´Â Æ÷ÀÎÅÍÀÇ ·¹ÆÛ·±½ºÀÌ´Ù. ÀÌ ¸Þ¸ð¸®´Â È£ÃâÃø¿¡¼­ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

ÀÌ ÇÔ¼ö´Â ÃÖ´ë 30MB±îÁöÀÇ ÆÄÀϸ¸ ´Ù¿î·Îµå¹Þ¾ÆÁÖ¸ç ±× ÀÌ»óÀÇ ÆÄÀÏ¿¡ ´ëÇؼ­´Â ¿¡·¯·Î ó¸®ÇÏ°í Àִµ¥ ÀÌ´Â ¾ÈÀü»óÀÇ ÀÌÀ¯ ¶§¹®ÀÌ´Ù. FTP ¼­¹ö´Â HTTP ¼­¹ö¿Í´Â ´Þ¸® ¼ö¹é MBÁ¤µµÀÇ ´ë¿ë·® ÆÄÀϵéÀÌ ¸¹ÀÌ Àִµ¥, ÀÌ·± ÆÄÀÏÀ» À߸ø ¼±ÅÃÇß´Ù°¡´Â °ÅÀÇ ÇÁ·Î±×·¥ÀÌ ´Ù¿î »óÅ°¡ µÊÀ¸·Î ÀÌ·± »óŸ¦ ¹æÁöÇϱâ À§ÇØ ¿ë·®ÀÇ Á¦ÇÑÀ» µÎ¾ú´Ù.

»ç½Ç 30MB ÀÌ»óÀ̳ª µÇ´Â ÅؽºÆ® ÆÄÀÏÀ» ´Ù¿î·Îµå¹Þ¾Æ¼­ ÆíÁýÇÑ ÈÄ ´Ù½Ã ¾÷·ÎµåÇÏ´Â °æ¿ì¶õ °ÅÀÇ ¾ø±â ¶§¹®¿¡ ÀÌ·± Á¦ÇÑÀÌ º° ¹®Á¦°¡ µÇÁö´Â ¾Ê´Â´Ù. ·ÎÄà ÆÄÀÏÀÇ °æ¿ì ¸Þ¸ð¸®°ü¸®»óÀÇ ÀÌÀ¯·Î 30MBÀÇ Á¦ÇÑÀ» µÎ¾úÀ¸¸ç 30MB¸¦ ³ÑÀ» °æ¿ì Á¤¸»·Î ¿­ °ÍÀÎÁö Áú¹®À» ÇßÁö¸¸ FTP ´Ù¿î·Îµå´Â Á¦ÇÑÀ» ³ÑÀ» °æ¿ì Áú¹®µµ ÇÏÁö ¾Ê°í ÀϹæÀûÀ¸·Î ¸Þ½ÃÁö¸¸ º¸¿©ÁÖ°í ¸®ÅÏÇØ ¹ö·È´Ù. ±×·¸°Ô Å« ÆÄÀÏÀ» ÆíÁýÇÏ·Á¸é µû·Î ´Ù¿î·Îµå¹Þ¾Æ¼­ ÆíÁýÇÏ´Â °ÍÀÌ ´õ ³ªÀº ¹æ¹ýÀÌ´Ù.

FTP ¼­¹ö¿¡ ÀÖ´Â ÆÄÀÏÀÇ Å©±â¸¦ Á¶»çÇϱâ À§ÇØ ÇϳªÀÇ ÆÄÀÏ¿¡ ´ëÇØ ¿­°Å¸¦ ÇÏ°í Àִµ¥ ÀÌ·± ¹æ¹ý ´ë½Å FtpGetFileSize ÇÔ¼ö·Î ÈξÀ ´õ °£´ÜÇÏ°Ô Á¶»çÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â IE 5.0À̻󿡼­¸¸ Áö¿øµÇ¸ç ºñÁÖ¾ó C++ 6.0¿¡¼­´Â ¾Æ¿¹ ÄÄÆÄÀÏÀÌ ¾ÈµÇ±â ¶§¹®¿¡ ¾î¿ ¼ö ¾øÀÌ FtpFindFirstFile ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´´Ù. Ç÷§Æû SDK¸¦ ¼³Ä¡ÇÏ°í IE 5.0ÀÌ»ó¿¡ ´ëÇؼ­¸¸ ½ÇÇàµÇµµ·Ï ÇÑ´Ù¸é FtpGetFileSize ÇÔ¼ö¸¦ »ç¿ëÇصµ »ó°ü¾øÁö¸¸ »ç¿ë ȯ°æ¿¡ Á¦¾àÀÌ »ý±ä´Ù´Â Á¡¿¡¼­ ¹Ù¶÷Á÷ÇÏÁö ¸øÇÏ´Ù.