¸¶. FTP ´ëÈ­»óÀÚ

FTP ¿­±â ´ëÈ­»óÀÚ´Â ¸¹Àº ÀÏÀ» ÇÑ´Ù. arFtp ¹è¿­¿¡ µî·ÏµÇ¾î ÀÖ´Â FTP ¼­¹öÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ°í »ç¿ëÀÚ°¡ ÀÌ Áß Çϳª¸¦ ¼±ÅÃÇÏ¿© ¿¬°á ¹öÆ°À» Ŭ¸¯ÇÏ¸é ¹Ì¸® ÀÛ¼ºµÈ Á¢¼ÓÁ¤º¸¸¦ ÂüÁ¶ÇÏ¿© FTP ¼­¹ö¿Í Åë½ÅÀ» ½ÃÀÛÇÑ´Ù. ¼­¹öÀÇ ÇöÀç Æú´õ¿¡ ÀÖ´Â ÆÄÀÏ°ú Æú´õÀÇ ¸ñ·ÏÀ» ÀÐ¾î ¸®½ºÆ® ºä¿¡ Ãâ·ÂÇϸç Æú´õ¸¦ ¼±ÅÃÇÏ¸é ¾ÈÀ¸·Î µé¾î°¡ Æú´õÀÇ ³»¿ëµµ º¸¿©ÁØ´Ù.

¸ñ·Ï¿¡¼­ ÆÄÀÏÀ» ¼±ÅÃÇÏ¸é ¼±ÅÃµÈ ÆÄÀϸíÀ» ¸®ÅÏÇÑ´Ù. ÆÄÀϸíÀ» ¸®ÅÏÇÒ »ÓÀÌÁö Á÷Á¢ ÆÄÀÏÀ» ÀоîÁÖ´Â °ÍÀº ¾Æ´Ï´Ù. À̶§ ¸®ÅϵǴ ÆÄÀÏ¸í¿¡´Â ÀÌ ÆÄÀÏÀ» ´Ù½Ã Àбâ À§ÇÑ ¸ðµç Á¤º¸µéÀÌ Æ÷ÇԵȴÙ. FTP ¿­±â ´ëÈ­»óÀÚÀÇ ±â´ÉÀº °ÅÀÇ ÀÛÀº FTP Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ¼öÁØÀÌ´Ù. ÃÖÁ¾ÀûÀ¸·Î ÆÄÀÏÀ» ¼±ÅÃÇÒ ¶§±îÁö´Â FTP ¼­¹ö¿Í Á¢¼ÓÀ» À¯ÁöÇØ¾ß ÇϹǷΠÁ¢¼Ó ÇÚµéÀº Àü¿ªÀ¸·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. ´ÙÀ½ µÎ º¯¼ö¸¦ ¼±¾ðÇϵµ·Ï ÇÏÀÚ.

 

HINTERNET hInternet, hFtp;

 

ÀÎÅͳݿ¡ ´ëÇÑ Á¢¼ÓÇÚµé°ú FTP ¼­¹ö¿¡ ´ëÇÑ Á¢¼Ó ÇÚµéÀ̸ç ÀÌ µÎ º¯¼ö°ªÀº FTP ¿­±â ´ëÈ­»óÀÚ°¡ ¶° ÀÖ´Â µ¿¾È À¯ÁöµÇ¾î¾ß ÇÑ´Ù. ´ÙÀ½Àº ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ °ø°³ FTP ¼­¹ö¿¡ Á¢¼ÓÇÑ ¸ð¾çÀÌ´Ù.

Á¢¼Ó ´ë»ó ÄÞº¸¹Ú½º¿¡ µî·ÏµÈ ¼­¹öÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ°í ¿¬°áµÇ¸é ÀÌ ¼­¹öÀÇ ÆÄÀÏ, Æú´õ ¸ñ·ÏÀ» Áß¾ÓÀÇ ¸®½ºÆ® ºä ÄÁÆ®·Ñ¿¡ º¸¿©ÁØ´Ù. ÆÄÀÏ ¸ñ·ÏÀ» º¸¿©ÁÖ¾î¾ß Çϱ⠶§¹®¿¡ ´ëÈ­»óÀÚÀÇ Å©±â°¡ Àû´çÈ÷ Ä¿¾ß Çϴµ¥ ¾Æ¿¹ Å©±â Á¶Á¤ÀÌ °¡´ÉÇÑ ½ºÅ¸ÀÏ·Î ÀÛ¼ºÇÏ´Â °Íµµ ±¦ÂúÀ» °Í °°´Ù. ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

BOOL CALLBACK DGFtpProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     int idx;

     int iItem;

     TCHAR Mes[256];

     LVCOLUMN COL;

     LVITEM LI;

     HWND hList;

     static HIMAGELIST hImgFtp;

     TCHAR Path[MAX_PATH];

     static TCHAR *FtpPath;

     static TCHAR Dir[MAX_PATH];

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          if (hImgFtp==NULL) {

              hImgFtp=ImageList_LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_FTP),

                   16, 1, RGB(255,255,255));

          }

          hList=GetDlgItem(hDlg,IDC_FTPFILE);

          ListView_SetImageList(hList, hImgFtp, LVSIL_SMALL);

          ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);

 

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT |LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=250;

          COL.pszText="À̸§";

          COL.iSubItem=0;

          ListView_InsertColumn(hList,0,&COL);

 

          COL.pszText="Å©±â";

          COL.cx=80;

          COL.iSubItem=1;

          ListView_InsertColumn(hList,1,&COL);

 

          COL.cx=150;

          COL.pszText="³¯Â¥";

          COL.iSubItem=2;

          ListView_InsertColumn(hList,2,&COL);

 

          LoadFtpServerList(hDlg);

          FtpPath=(TCHAR *)lParam;

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDC_BTNFTPADD:

              if (SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCOUNT,0,0)

                   == sizeof(Option.arFtp)/sizeof(Option.arFtp[0])-1) {

                   MessageBox(hDlg,"FTP ¼­¹ö¸¦ ´õ µî·ÏÇÒ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTPCONFIG),

                   hDlg, DGFtpConfigProc,(LPARAM)-1)==IDOK) {

                   LoadFtpServerList(hDlg);

              }

              return TRUE;

          case IDC_BTNFTPEDIT:

              idx=SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCURSEL,0,0);

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTPCONFIG),

                   hDlg, DGFtpConfigProc,(LPARAM)idx)==IDOK) {

                   LoadFtpServerList(hDlg);

              }

              return TRUE;

          case IDC_BTNFTPDELETE:

              idx=SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCURSEL,0,0);

              wsprintf(Mes,"%s FTP ¼­¹öÀÇ Á¤º¸¸¦ »èÁ¦ÇϽðڽÀ´Ï±î?",Option.arFtp[idx].Name);

              if (MessageBox(hDlg,Mes,"Áú¹®",MB_YESNO)==IDYES) {

                   for (;;idx++) {

                        Option.arFtp[idx]=Option.arFtp[idx+1];

                        if (lstrlen(Option.arFtp[idx].Name)==0) {

                            break;

                        }

                   }

                   LoadFtpServerList(hDlg);

              }

              return TRUE;

          case IDC_BTNFTPCONNECT:

              if (hFtp==NULL) {

                   idx=SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCURSEL,0,0);

                   if (DgFtpConnect(Option.arFtp[idx].Addr,Option.arFtp[idx].User,

                        Option.arFtp[idx].Pass,Option.arFtp[idx].Port)==FALSE) {

                        MessageBox(hDlg,"FTP ¼­¹ö¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

                   } else {

                        SetWindowText(GetDlgItem(hDlg,IDC_BTNFTPCONNECT),"¿¬°á ÇØÁ¦");

                        DgFtpEnumFiles(hDlg);

                        lstrcpy(Dir,"");

                        wsprintf(Mes, "ÇöÀç À§Ä¡ : %s", Dir);

                        SetDlgItemText(hDlg,IDC_STFTPSTATUS,Mes);

                   }

              } else {

                   DgFtpUnConnect();

                   SetWindowText(GetDlgItem(hDlg,IDC_BTNFTPCONNECT),"¿¬°á");

                   SetDlgItemText(hDlg,IDC_STFTPSTATUS,"ÇöÀç »óÅ : ¿¬°á ¾ÈµÇ¾úÀ½");

                   ListView_DeleteAllItems(GetDlgItem(hDlg,IDC_FTPFILE));

              }

              return TRUE;

          case IDCANCEL:

              if (hFtp) {

                   DgFtpUnConnect();

                   hImgFtp=NULL;

              }

              EndDialog(hDlg,0);

              return TRUE;

          case IDC_BTNFTPOPEN:

              if (hFtp == NULL) {

                   return TRUE;

              }

              hList=GetDlgItem(hDlg,IDC_FTPFILE);

              iItem=ListView_GetNextItem(hList,-1,LVNI_ALL | LVNI_SELECTED);

              if (iItem == -1) {

                   return TRUE;

              }

              if (iItem == 0) {

                   if (FtpSetCurrentDirectory(hFtp,"..")==TRUE) {

                        DgFtpEnumFiles(hDlg);

                        if (lstrlen(Dir)!=0) {

                            *(strrchr(Dir, ¡®/¡¯))=0;

                        }

                        wsprintf(Mes, "ÇöÀç À§Ä¡ : %s", Dir);

                        SetDlgItemText(hDlg,IDC_STFTPSTATUS,Mes);

                   }

                   return TRUE;

              }

 

              LI.iItem=iItem;

              LI.iSubItem=0;

              LI.pszText=Path;

              LI.cchTextMax=255;

              LI.mask=LVIF_IMAGE | LVIF_TEXT;

              ListView_GetItem(hList,&LI);

 

              if (LI.iImage == 0) {

                   if (FtpSetCurrentDirectory(hFtp,Path)==TRUE) {

                        DgFtpEnumFiles(hDlg);

                        lstrcat(Dir,"/");

                        lstrcat(Dir,Path);

                        wsprintf(Mes, "ÇöÀç À§Ä¡ : %s", Dir);

                        SetDlgItemText(hDlg,IDC_STFTPSTATUS,Mes);

                   }

              } else {

                   idx=SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCURSEL,0,0);

                   wsprintf(FtpPath,"ftp://%s:%s:%s:%d%s/%s",Option.arFtp[idx].User,

                        Option.arFtp[idx].Pass,Option.arFtp[idx].Addr,

                        Option.arFtp[idx].Port,Dir,Path);

 

                   DgFtpUnConnect();

                   EndDialog(hDlg,IDOK);

                   hImgFtp=NULL;

                   UpdateWindow(g_hFrameWnd);

              }

              return TRUE;

          }

          return FALSE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          LPNMITEMACTIVATE nia;

          hdr=(LPNMHDR)lParam;

          nia=(LPNMITEMACTIVATE)lParam;

          hList=GetDlgItem(hDlg,IDC_FTPFILE);

          if (hdr->hwndFrom == hList) {

              switch (hdr->code) {

              case NM_DBLCLK:

                   SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNFTPOPEN,BN_CLICKED),0);

                   break;

              }

          }

          break;

     }

     return FALSE;

}

 

¼­¹öÀÇ µî·Ï, ÆíÁý ¹öÆ°Àº ¾Õ¼­ ÀÛ¼ºÇسõÀº IDD_FTPCONFIG ´ëÈ­»óÀÚ¸¦ È£ÃâÇÑ´Ù. ÆíÁýÇÒ ¶§´Â ÆíÁý ´ë»ó ¼­¹öÀÇ Ã·ÀÚ¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ°Ü ÁÖ°í »õ·Î µî·ÏÇÒ ¶§´Â -1À» Àü´ÞÇÏ¸é µÈ´Ù. ¼­¹ö Á¤º¸ÀÇ Ãß°¡, ÆíÁýÀº ¼­¹ö °ü¸® ´ëÈ­»óÀÚ°¡ ¾Ë¾Æ¼­ ÇϹǷΠÀÌ ´ëÈ­»óÀÚ´Â º¯°æµÈ ¼­¹ö ¸ñ·ÏÀ» ´Ù½Ã ÀÐ¾î ¿À±â¸¸ ÇÑ´Ù. »èÁ¦½Ã´Â arFtp ¹è¿­¿¡¼­ ÇØ´ç ¼­¹öÀÇ ¿ä¼Ò¸¦ Áö¿ì´Âµ¥ ÀÌ ÀÛ¾÷Àº FTP ¿­±â ´ëÈ­»óÀÚ°¡ Á÷Á¢ ÇÑ´Ù. ´ÙÀ½Àº ÀÌ ´ëÈ­»óÀÚ¿¡¼­ È£ÃâÇÏ´Â º¸Á¶ ÇÔ¼öµéÀÌ´Ù.

 

BOOL DgFtpConnect(TCHAR *Server, TCHAR *User, TCHAR *Pass, int Port);

void DgFtpUnConnect();

void DgFtpAddFile(HWND hDlg,WIN32_FIND_DATA wfd);

void DgFtpEnumFiles(HWND hDlg);

void LoadFtpServerList(HWND hDlg);

 

FTP¿¬°á ¹× ÇØÁ¦,  µî·ÏµÈ ¼­¹öÀÇ ¸ñ·Ï °¡Á®¿À±â, ÆÄÀÏ ¸ñ·Ï °ü¸® µîÀÇ ±â´ÉÀ» Á¦°øÇϸç FTP ¿­±â ´ëÈ­»óÀÚ¿¡¼­ ÀÌ ÇÔ¼öµéÀ» È£ÃâÇÑ´Ù. ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

BOOL DgFtpConnect(TCHAR *Server, TCHAR *User, TCHAR *Pass, int Port)

{

     SetCursor(LoadCursor(NULL,IDC_WAIT));

     hInternet=InternetOpen("Dangeun", INTERNET_OPEN_TYPE_PRECONFIG,

          NULL, NULL, 0);

     if (hInternet == NULL) {

          return FALSE;

     }

 

     hFtp=InternetConnect(hInternet,Server,Port,User,Pass,INTERNET_SERVICE_FTP,0,0);

     if (hFtp==NULL) {

          InternetCloseHandle(hInternet);

          return FALSE;

     }

     return TRUE;

}

 

void DgFtpUnConnect()

{

     InternetCloseHandle(hFtp);

     InternetCloseHandle(hInternet);

     hFtp=NULL;

     hInternet=NULL;

}

 

void DgFtpAddFile(HWND hDlg,WIN32_FIND_DATA wfd)

{

     HWND hList;

     LVITEM LI,LI2;

     int idx;

     TCHAR szTmp[50];

     SYSTEMTIME st;

     TCHAR Text[MAX_PATH];

 

     hList=GetDlgItem(hDlg,IDC_FTPFILE);

     LI.mask=LVIF_TEXT | LVIF_IMAGE;

 

     if (strcmp(wfd.cFileName,"»óÀ§ Æú´õ·Î À̵¿")!=0) {

          if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)

              LI.iImage=0;

          else

              LI.iImage=1;

     } else {

          LI.iImage=2;

     }

     LI.iSubItem=0;

     LI.pszText=wfd.cFileName;

 

     if (LI.iImage == 2) {

          idx=0;

     } else {

          idx=1;

          if (LI.iImage == 1) {

              for (;;idx++) {

                   LI2.mask=LVIF_IMAGE;

                   LI2.iItem=idx;

                   LI2.iSubItem=0;

                   if (ListView_GetItem(hList,&LI2)==FALSE) {

                        break;

                   }

                   if (LI2.iImage == 1) {

                        break;

                   }

              }

          }

 

          for (;;idx++) {

              LI2.mask=LVIF_TEXT | LVIF_IMAGE;

              LI2.iItem=idx;

              LI2.iSubItem=0;

              LI2.pszText=Text;

              LI2.cchTextMax=MAX_PATH;

              if (ListView_GetItem(hList,&LI2)==FALSE) {

                   break;

              }

              if (LI.iImage == 0 && LI2.iImage == 1) {

                   break;

              }

              if (lstrcmpi(wfd.cFileName, Text) < 0) {

                   break;

              }

          }

     }

 

     LI.iItem=idx;

     ListView_InsertItem(hList,&LI);

 

     if (strcmp(wfd.cFileName,"»óÀ§ Æú´õ·Î À̵¿")!=0) {

          if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {

              lstrcpy(szTmp,"<Æú´õ>");

          } else {

              itoa(wfd.nFileSizeLow,szTmp,10);

          }

          ListView_SetItemText(hList,idx,1,szTmp);

          FileTimeToSystemTime(&wfd.ftLastWriteTime,&st);

          wsprintf(szTmp,"%d³â %d¿ù %dÀÏ %d½Ã %dºÐ",st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);

          ListView_SetItemText(hList,idx,2,szTmp);

     }

     UpdateWindow(hList);

}

 

void DgFtpEnumFiles(HWND hDlg)

{

     WIN32_FIND_DATA wfd;

     BOOL bResult=TRUE;

     HINTERNET hFind;

 

     if (hFtp==NULL)

          return;

 

     SetCursor(LoadCursor(NULL,IDC_WAIT));

     ListView_DeleteAllItems(GetDlgItem(hDlg,IDC_FTPFILE));

     lstrcpy(wfd.cFileName,"»óÀ§ Æú´õ·Î À̵¿");

     DgFtpAddFile(hDlg,wfd);

 

     hFind=FtpFindFirstFile(hFtp,"*.*",&wfd,0,0);

     if (hFind!=NULL) {

          DgFtpAddFile(hDlg,wfd);

          while (bResult) {

              bResult=InternetFindNextFile(hFind,&wfd);

              if (bResult==TRUE) {

                   DgFtpAddFile(hDlg,wfd);

              }

          }

          InternetCloseHandle(hFind);

     }

}

 

void LoadFtpServerList(HWND hDlg)

{

     int idx;

     BOOL bEnable;

 

     SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_RESETCONTENT,0,0);

     for (idx=0;;idx++) {

          if (lstrlen(Option.arFtp[idx].Name)==0) {

              break;

          }

          SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_ADDSTRING,0,(LPARAM)Option.arFtp[idx].Name);

     }

     SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_SETCURSEL,0,0);

 

     if (SendDlgItemMessage(hDlg,IDC_FTPSERVER,CB_GETCOUNT,0,0) == 0) {

          bEnable=FALSE;

     } else {

          bEnable=TRUE;

     }

     EnableWindow(GetDlgItem(hDlg,IDC_BTNFTPCONNECT),bEnable);

     EnableWindow(GetDlgItem(hDlg,IDC_BTNFTPEDIT),bEnable);

     EnableWindow(GetDlgItem(hDlg,IDC_BTNFTPDELETE),bEnable);

}

 

FTP ¼­¹ö·ÎÀÇ Á¢¼Ó ¹× ÇØÁ¦, ÆÄÀÏ ¸ñ·Ï Àб⠵ ´ëÇؼ­´Â WinInet ¶óÀ̺귯¸® °ü·Ã ¹®¼­¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. WinInetÀ» ¸ð¸£°í¼­´Â ÀÌ Äڵ带 ÀÌÇØÇÒ ¼ö ¾øÀ¸¹Ç·Î ¹Ýµå½Ã µû·Î °øºÎÇÑ ÈÄ¿¡ ºÐ¼®Çغ¸±â ¹Ù¶õ´Ù. WinInet¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ÀÌ ÇÔ¼öÀÇ ³»¿ëÀº ¾î·ÆÁö ¾Ê°Ô ÆľÇÇÒ ¼ö ÀÖÀ¸¹Ç·Î µû·Î »ó¼¼ÇÑ ºÐ¼®Àº ÇÏÁö ¾Ê´Â´Ù.

Æú´õÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â ¹æ¹ýÀº ÆÄÀÏâÀÌ ·ÎÄà µå¶óÀ̺êÀÇ ÆÄÀÏ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â ¹æ¹ý°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. ¾ËÆĺª¼øÀ¸·Î Á¤·ÄÇؼ­ º¸¿©ÁÖµÇ Æú´õ¸¦ ¿ì¼±ÀûÀ¸·Î º¸¿©ÁÖ°í Æú´õ ´ÙÀ½¿¡ ÆÄÀÏÀÇ ¸ñ·ÏÀ» º¸¿©ÁØ´Ù.