1.FTP Ŭ¶óÀ̾ðÆ®

°¡.¿©·¯ °³ÀÇ ÆÄÀÏ ¿­±â

´ç±Ù 1.0¿¡´Â FTP ¿¬°á ±â´ÉÀÌ À־ ¿ø°ÝÁöÀÇ ÆÄÀÏÀ» ÆíÁýÇÒ ¼öµµ ÀÖ´Ù. »ç½Ç ÆíÁý±âÀÇ FTP ±â´ÉÀº ±× Á¤µµ¸é ÃæºÐÇÏÁö¸¸ ÀÌ¿Õ FTP Á¢¼ÓÀ» ÇÑ ±è¿¡ ¿ø°ÝÁöÀÇ ÆÄÀÏÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â °£´ÜÇÑ ÀÛ¾÷µµ ÇÒ ¼ö ÀÖ´Ù¸é ÁÁÀ» °ÍÀÌ´Ù. ´ç±Ù 1.0Àº ¿À·ÎÁö ÆÄÀÏÀ» ÀÐ°í ¾²´Â °Í¸¸ °¡´ÉÇÏ¸ç »õ ÆÄÀÏÀ̳ª Æú´õ¸¦ ¸¸µé ¼ö ¾ø°í À̸§ º¯°æÀ̳ª »èÁ¦µµ ºÒ°¡´ÉÇß´Ù. ¶ÇÇÑ FTP ¿¬°á ÇÁ·Î±×·¥À¸·Î¼­ °¡Àå ±âº»ÀûÀÎ ¾÷·Îµå, ´Ù¿î·Îµå ±â´Éµµ ¾ø¾ú´Ù.

´ç±Ù 2.0Àº ÀÌ¿Õ FTP¿¡ ¿¬°áÇÏ´Â ±è¿¡ °£´ÜÇϳª¸¶ FTP Ŭ¶óÀ̾ðÆ®ÀÇ ¿ªÇÒÀ» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ±â´ÉÀ» ´ëÆø È®ÀåÇÒ °ÍÀÌ´Ù. ¹°·Ð ÈξÀ ´õ ¾ÈÁ¤ÀûÀÌ°í °­·ÂÇÑ FTP Ŭ¶óÀÌ¾ðÆ®µéÀÌ ³Î·Á ÀÖ´Â »óȲ¿¡¼­ ÅØ½ºÆ® ÆíÁý±â¿¡ ÀÌ·± ±â´ÉÀ» ³Ö´Â´Ù´Â °ÍÀº ºÒÇÕ¸®ÇÒ ¼öµµ ÀÖÀ¸³ª Á¢¼ÓÀÌ µÇ¸é °ü¸®µµ µÈ´Ù°í ±â´ëÇϱ⠶§¹®¿¡ ¿ÏÀüÈ÷ »© ¹ö¸®±â¿¡´Â Á¶±Ý ¼·¼·ÇÑ °¨ÀÌ ÀÖ´Ù. ±âÁ¸ Äڵ带 Á¶±Ý ¼öÁ¤ÇÏ´Â Á¤µµ°¡ ¾Æ´Ï¹Ç·Î °ÅÀÇ ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. DgFtpProcÀº ´ÙÀ½°ú °°ÀÌ ¿ÏÀüÈ÷ ¶â¾î °íÄ£´Ù.

 

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

{

     int idx;

     int iItem;

     TCHAR Mes[256];

     LVCOLUMN COL;

     LVITEM LI;

     static HWND hList;

     static HIMAGELIST hImgFtp;

     TCHAR Path[MAX_PATH];

     static TCHAR *FtpPath;

     static TCHAR Dir[MAX_PATH];

     TCHAR *p;

 

     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;

          DragAcceptFiles(hDlg,TRUE);

          return TRUE;

     case WM_DROPFILES:

          FtpUpLoad(hDlg,hList,(HDROP)wParam);

          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),"¿¬°á ÇØÁ¦(&C)");

                        DgFtpEnumFiles(hDlg);

                        lstrcpy(Dir,"");

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

                        SetDlgItemText(hDlg,IDC_STFTPSTATUS,Mes);

                        EnableFtpButton(hDlg,TRUE);

                   }

              } else {

                   DgFtpUnConnect();

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

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

                   ListView_DeleteAllItems(GetDlgItem(hDlg,IDC_FTPFILE));

                   EnableFtpButton(hDlg,FALSE);

              }

              return TRUE;

          case IDCANCEL:

              if (hFtp) {

                   DgFtpUnConnect();

                   hImgFtp=NULL;

              }

              EndDialog(hDlg,0);

              return TRUE;

          case IDC_BTNFTPOPEN:

              if (hFtp == NULL) {

                   return TRUE;

              }

              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=MAX_PATH;

              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);

                   }

                   return TRUE;

              }

 

              memset(FtpPath,0,10000);

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

              // ÇÑ °³¸¸ ¼±ÅÃÇÑ °æ¿ì

              if (ListView_GetSelectedCount(hList) == 1) {

                   LI.iItem=iItem;

                   LI.iSubItem=0;

                   LI.pszText=Path;

                   LI.cchTextMax=255;

                   LI.mask=LVIF_TEXT;

                   ListView_GetItem(hList,&LI);

                   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);

              // ¿©·¯ °³¸¦ ¼±ÅÃÇÑ °æ¿ì

              } else {

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

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

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

                   p=FtpPath+lstrlen(FtpPath)+1;

                   while (iItem != -1) {

                        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 == 1) {

                            lstrcat(p,Path);

                            p=p+lstrlen(Path)+1;

                        }

 

                        if (p-FtpPath > 10000-MAX_PATH) {

                            break;

                        }

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

                   }

              }

              DgFtpUnConnect();

              EndDialog(hDlg,IDOK);

              hImgFtp=NULL;

              UpdateWindow(g_hFrameWnd);

              return TRUE;

          case IDC_BTNFTPNEW:

              FtpNewFile(hDlg,hList,FALSE);

              return TRUE;

          case IDC_BTNFTPNEWFOLDER:

              FtpNewFile(hDlg,hList,TRUE);

              return TRUE;

          case IDC_BTNFTPDEL:

              FtpDelete(hDlg,hList);

              return TRUE;

          case IDC_BTNFTPRENAME:

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

              if (iItem == -1) {

                   return TRUE;

              }

              // ÆíÁýÀ» ½ÃÀÛÇÒ ¶§ ¹Ýµå½Ã Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.

              SetFocus(hList);

              ListView_EditLabel(hList,iItem);

              return TRUE;

          case IDC_BTNFTPDOWN:

              FtpDownLoad(hDlg,hList);

              return TRUE;

          case IDC_BTNFTPUP:

              MessageBox(hDlg,"¾÷·ÎµåÇÒ ÆÄÀÏÀ̳ª Æú´õ¸¦ Ž»ö±â¿¡¼­ µå·¡±×ÇÏ¿© ÀÌ ´ëÈ­»óÀÚ¿¡ "

                   "¶³¾î¶ß¸®½Ê½Ã¿À","¾Ë¸²",MB_OK);

              return TRUE;

          }

          return FALSE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          LPNMITEMACTIVATE nia;

          NMLVDISPINFO *ndi;

          hdr=(LPNMHDR)lParam;

          nia=(LPNMITEMACTIVATE)lParam;

          ndi=(NMLVDISPINFO *)lParam;

          if (hdr->hwndFrom == hList) {

              switch (hdr->code) {

              case NM_DBLCLK:

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

                   return TRUE;

              case LVN_BEGINLABELEDIT:

                   LI.iItem=ndi->item.iItem;

                   LI.iSubItem=0;

                   LI.mask=LVIF_IMAGE;

                   ListView_GetItem(hList,&LI);

                   if (LI.iImage!=2) {

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);

                   }

                   return TRUE;

              case LVN_ENDLABELEDIT:

                   if (ndi->item.pszText == NULL) {

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        LI.iItem=ndi->item.iItem;

                        LI.iSubItem=0;

                        LI.pszText=Path;

                        LI.cchTextMax=MAX_PATH;

                        LI.mask=LVIF_TEXT;

                        ListView_GetItem(hList,&LI);

                        if (FtpRenameFile(hFtp,Path,ndi->item.pszText)==FALSE) {

                            SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                        } else {

                            SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);

                        }

                   }

                   return TRUE;

              case LVN_KEYDOWN:

                   switch (((NMLVKEYDOWN *)lParam)->wVKey) {

                   case VK_DELETE:

                        if (IsWindowEnabled(GetDlgItem(hDlg,IDC_BTNFTPDEL))) {

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

                        }

                        break;

                   case VK_F2:

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

                        break;

                   default:

                        break;

                   }

                   return TRUE;

              }

          }

          break;

     }

     return FALSE;

}

 

hList¸¦ staticÀ¸·Î ¼±¾ðÇßÀ¸¸ç ¿¬°áµÉ ¶§ ¹öưÀÇ Ä¸¼Ç¿¡ &C¸¦ ºÙ¿© ÁÖ¾ú´Ù. ±×¿Ü ¸¹Àº ±â´ÉÀÌ Ãß°¡µÇ¾ú´Ù. ´ëÈ­»óÀÚ¿¡¼­ ¸ðµç °ÍÀ» ´Ù ó¸®Çϱâ Èûµé±â ¶§¹®¿¡ ¼­ºê ÇÔ¼öµéÀ» ¿©·¯°³ ´õ ¸¸µç´Ù. ´ÙÀ½ ÇÔ¼öÀÇ ¿øÇüÀ» Internet.h¿¡ ¼±¾ðÇÑ´Ù.

 

void EnableFtpButton(HWND hDlg,BOOL bEnable);

void FtpNewFile(HWND hDlg,HWND hList,BOOL bFolder);

void FtpDelete(HWND hDlg,HWND hList);

BOOL FtpDeleteFolder(TCHAR *Path);

void FtpDownLoad(HWND hDlg,HWND hList);

BOOL FtpDownLoadFile(TCHAR *Path,TCHAR *DownPath,unsigned FileSize);

BOOL FtpDownLoadFolder(TCHAR *Path,TCHAR *DownPath);

void FtpUpLoad(HWND hDlg,HWND hList,HDROP hDrop);

BOOL FtpUpLoadFile(TCHAR *Path);

BOOL FtpUpLoadFolder(TCHAR *Path);

 

´ëÈ­»óÀÚ ¸®¼Ò½ºµµ ¼öÁ¤µÇ¾úÀ¸¸ç ¿¬°á »óÅ¿¡ µû¶ó ¹öưµéÀÇ »óŵµ °ü¸®ÇÑ´Ù. ¹öưÀÇ °³¼ö°¡ ¸¹±â ¶§¹®¿¡ ¹öưÀÇ »óŸ¦ °ü¸®ÇÏ´Â º°µµÀÇ ÇÔ¼ö¸¦ ¸¸µé°í ¿¬°á ¹öưÀ» ´­·¶À» ¶§ ÀÌ ÇÔ¼ö¸¦ ÀûÀýÈ÷ È£ÃâÇÏ¿© ¹öưÀÇ »ç¿ë °¡´É¼ºÀ» ÅëÁ¦ÇÑ´Ù.

 

void EnableFtpButton(HWND hDlg,BOOL bEnable)

{

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

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

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

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

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

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

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

}

 

Çѹø¿¡ Çϳª¸¸ ¿­ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù. º¹¼ö °³ÀÇ ÆÄÀÏÀ» ÇѲ¨¹ø¿¡ ¿­ ¼ö ÀÖµµ·Ï ÇØ º¸ÀÚ. ¿­±â ¹öưÀ» ´­·¶À» ¶§ÀÇ Äڵ带 º¸ÀÚ. ÇѰ³¸¸ ¼±ÅÃÇÑ °æ¿ì´Â ±âÁ¸ ÄÚµå¿Í µ¿ÀÏÇϳª ¿©·¯ °³¸¦ ¼±ÅÃÇÑ °æ¿ì lParamÀ¸·Î Àü´ÞµÈ FtpPath ¹è¿­¿¡ Æú´õ¿Í ¼±Åà ÆÄÀϸíÀ» Á¶¸³Çؼ­ È£Ãâ¿øÀ¸·Î ¸®ÅÏÇÑ´Ù. ÀÌ ´ëÈ­»óÀÚÀÇ ÀÓ¹«´Â FTP ¼­¹ö¿¡¼­ ¼±ÅÃÇÑ ÆÄÀÏÀÇ ¸ñ·ÏÀ» Á¶»çÇÏ´Â °ÍÀÌÁö ÆÄÀÏÀ» Á÷Á¢ ¿ÀÇÂÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ¸ñ·Ï¸¸ Á¶»çÇØ¾ß ÇÑ´Ù.

FtpPath ¹öÆÛ´Â ÆÄÀÏ ¿­±â °øÅë ´ëÈ­»óÀÚ¿Í ¸¶Âù°¡Áö Æ÷¸ËÀ» »ç¿ëÇϴµ¥ µð·ºÅ丮¸íÀÌ Á¦ÀÏ ¾Õ¿¡ ÀÖ°í À̾ ¼±ÅÃµÈ ÆÄÀϸíµéÀÌ ³Î·Î ±¸ºÐµÇ¾î ÀÓÀÇ °³¼ö¸¸Å­ ¿Ã ¼ö ÀÖ´Ù.  FTP ¿­±â ¸í·ÉÀº ´ÙÀ½°ú °°ÀÌ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.

 

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

{

     ....

     case IDM_FILE_FTPOPEN:

          TCHAR *FtpPath,*p;

          TCHAR Dir[MAX_PATH+64];

          FtpPath=(TCHAR *)malloc(10000);

          if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTP),

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

              p=FtpPath;

              lstrcpy(Dir,p);

              p=p+lstrlen(Dir)+1;

              if (*p==0) {

                   OpenFromFile(Dir);

              } else {

                   for (;*p;) {

                       wsprintf(Path,"%s%s",Dir,p);

                        p=p+lstrlen(p)+1;

                        OpenFromFile(Path);

                   }

              }

          }

          free(FtpPath);

          break;

 

10000¹ÙÀÌÆ®¸¦ ÇÒ´çÇÏ¿© ¹öÆÛ¸¦ ´ëÈ­»óÀÚ¿¡°Ô Àü´ÞÇϸé ÀÌ ¹öÆÛ¿¡ ¼±ÅÃµÈ ÆÄÀÏÀÇ ¸ñ·ÏÀÌ ¸®ÅϵȴÙ. Open ÇÔ¼ö¿¡¼­ ÆÄÀÏ ¿­±â ´ëÈ­»óÀÚÀÇ ¼±ÅÃµÈ ÆÄÀϸíÀ» ±¸ÇÏ´Â °Í°ú °ÅÀÇ ºñ½ÁÇÏ´Ù. ÀÌ ¹æ½ÄÀ» »ç¿ëÇϸé ÇѲ¨¹ø¿¡ ¿©·¯ °³ÀÇ ÆÄÀÏÀ» ¿­ ¼ö ÀÖ´Ù. ÇÁ·ÎÁ§Æ® °ü¸® ´ëÈ­»óÀÚ¿¡¼­ FTP ÆÄÀÏÀ» Ãß°¡ÇÒ ¶§µµ ¸¶Âù°¡Áö 󸮰¡ ÇÊ¿äÇÏ´Ù.

 

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

{

          ....

          case IDC_BTNPRJFTP:

              TCHAR *FtpPath,*p;

              TCHAR Dir[MAX_PATH+64];

              FtpPath=(TCHAR *)malloc(10000);

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTP),

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

                   Modified=TRUE;

                   p=FtpPath;

                   lstrcpy(Dir,p);

                   p=p+lstrlen(Dir)+1;

                   if (*p==0) {

                        AddFileToProject(hDlg,Dir,TRUE);

                   } else {

                        for (;*p;) {

                            wsprintf(Path,"%s%s",Dir,p);

                            p=p+lstrlen(p)+1;

                            AddFileToProject(hDlg,Path,TRUE);

                        }

                   }

              }

              free(FtpPath);

              return TRUE;

 

¿ø°ÝÁöÀÇ ÆÄÀϵéÀ» ÇѲ¨¹ø¿¡ ¿­ ¼ö ÀÖ´Ù´Â Á¡¿¡¼­´Â ÈǸ¢ÇÏÁö¸¸ ÆÄÀÏ Çϳª¸¦ ¿­ ¶§¸¶´Ù ÀÎÅÍ³Ý Á¢¼ÓÀ» ´Ù½Ã ÇÑ´Ù´Â Á¡ÀÌ Á» ¾Æ½±´Ù. ±¸Á¶¸¦ Á» ¼öÁ¤Çϸé Çѹø ¿¬°áÇÑ ÈÄ ¸ðµÎ ´Ù¿î·Îµå ¹ÞÀ» ¼öµµ ÀÖÁö¸¸ ±×·¸°Ô ÇÏÀÚ¸é MRU, »ìÆìº¸±â ¸ðµå µîÀ» ó¸®ÇϱⰡ ±î´Ù·Î¿ÍÁø´Ù. ÀÚÁÖ ÀÖ´Â ÀÏÀÌ ¾Æ´Ï¹Ç·Î ±×³É ÀÌ´ë·Î µÎ±â·Î ÇÑ´Ù.

³ª.»õ ÆÄÀÏ

¿ø°ÝÁö¿¡ »õ·Î ÆÄÀÏÀ̳ª Æú´õ¸¦ »ý¼ºÇÏ´Â ±â´Éµµ Á¦°øÇÑ´Ù. WinInet ¶óÀ̺귯¸®¿¡ °ü·Ã ÇÔ¼öµéÀÌ Á¦°øµÇ¹Ç·Î ·ÎÄÿ¡¼­ ÀÛ¾÷ÇÏ´Â °Í°ú º°¹Ý Ʋ¸®Áö ¾Ê´Ù.

 

void FtpNewFile(HWND hDlg,HWND hList,BOOL bFolder)

{

     TCHAR Name[10];

     TCHAR Path[MAX_PATH];

     LVFINDINFO fi;

     int i,idx;

     HINTERNET hRemote;

 

     if (bFolder) {

          lstrcpy(Name,"»õÆú´õ");

     } else {

          lstrcpy(Name,"»õÆÄÀÏ");

     }

 

     // À̸§À» ã´Â´Ù

     fi.flags=LVFI_STRING;

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

          if (i==0) {

              lstrcpy(Path,Name);

          } else {

              wsprintf(Path,"%s%d",Name,i);

          }

          fi.psz=Path;

          idx=ListView_FindItem(hList,-1,&fi);

          if (idx==-1) {

              break;

          }

     }

     if (bFolder) {

          if (FtpCreateDirectory(hFtp,Path)==FALSE) {

              MessageBox(hDlg,"FTP ¼­¹ö¿¡ Æú´õ¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

              return;

          }

     } else {

          hRemote=FtpOpenFile(hFtp,Path,GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY,0);

          if (hRemote==NULL) {

              MessageBox(hDlg,"FTP ¼­¹ö¿¡ ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

              return;

          }

          InternetCloseHandle(hRemote);

     }

     DgFtpEnumFiles(hDlg);

     idx=ListView_FindItem(hList,-1,&fi);

     SetFocus(hList);

     ListView_EditLabel(hList,idx);

}

 

»õÆú´õ ¶Ç´Â »õÆÄÀÏÀ̶ó´Â µðÆúÆ® À̸§À» ºÙÀÌµÇ °°Àº À̸§À» °¡Áø ÆÄÀÏÀÌ ÀÌ¹Ì ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î À̸§ µÚ¿¡ ÀÏ·Ã ¹øÈ£¸¦ ºÙ¿´´Ù. À̸§À» °Ë»öÇÒ ¶§´Â FTP ¼­¹ö¸¦ Á÷Á¢ Á¶»çÇÒ ÇÊ¿ä¾øÀÌ ¸®½ºÆ® ºä¿¡ ÀÌ¹Ì Á¶»çµÈ ¸ñ·ÏÀ» °Ë»öÇØ º¸¸é µÈ´Ù. »õ ÆÄÀÏÀ» ¸¸µç ÈÄ ¸ñ·ÏÀ» ´Ù½Ã Á¶»çÇÏ°í »õ·Î Ãß°¡µÈ ÆÄÀÏÀÇ À̸§À» º¯°æÇÒ ¼ö ÀÖµµ·Ï ÆíÁý ¸ðµå·Î µé¾î°£´Ù. ¸®½ºÆ® ºä´Â ÆíÁý ¸ðµå·Î µé¾î°¡±â Àü¿¡ ¹Ýµå½Ã Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.

À̸§ º¯°æÀº  DgFtpProc¿¡¼­ Á÷Á¢ ó¸®Çϴµ¥ LVN_BEGINLABELEDIT ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÇØ´ç Ç׸ñÀÇ À̹ÌÁö¸¦ º¸°í "»óÀ§ Æú´õ·Î À̵¿" Ç׸ñ¸¸ ¾Æ´Ï¸é À̸§À» º¯°æÇϵµ·Ï Çã°¡ÇÑ´Ù. ÆíÁýÀÌ ³¡³ª¸é LVN_ENDLABELEDIT¿¡¼­ À̸§À» º¯°æÇÑ´Ù. LVN_KEYDOWN¿¡¼­ F2Ű¿Í Del ´ÜÃà۵µ Áö¿øÇÑ´Ù.

´Ù.»èÁ¦

»èÁ¦´Â ´ÙÀ½ µÎ ÇÔ¼ö·Î ±¸ÇöÇß´Ù.

 

void FtpDelete(HWND hDlg,HWND hList)

{

     int iItem;

     LVITEM LI;

     TCHAR Path[MAX_PATH];

 

     if (MessageBox(hDlg,"¼±ÅÃÇÑ ÆÄÀϵéÀ» FTP ¼­¹ö¿¡¼­ »èÁ¦ÇϽðڽÀ´Ï±î?\r\n"

          "¿ø°ÝÁöÀÇ »èÁ¦µÈ ÆÄÀÏÀº ´Ù½Ã º¹±¸ÇÒ ¼ö ¾ø½À´Ï´Ù.",

          "Áú¹®",MB_YESNO)==IDNO) {

          return;

     }

 

     SetCursor(LoadCursor(NULL,IDC_WAIT));

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

     while (iItem!=-1) {

          LI.iItem=iItem;

          LI.iSubItem=0;

          LI.pszText=Path;

          LI.cchTextMax=MAX_PATH;

          LI.mask=LVIF_IMAGE | LVIF_TEXT;

          ListView_GetItem(hList,&LI);

          // ·çÆ®´Â ¼±ÅõǾî À־ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù.

          if (LI.iImage==0) {

              if (FtpDeleteFolder(Path)==FALSE) {

                   break;

              }

          } else if (LI.iImage==1) {

              if (FtpDeleteFile(hFtp,Path)==FALSE) {

                   break;

              }

          }

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

     }

     DgFtpEnumFiles(hDlg);

}

 

BOOL FtpDeleteFolder(TCHAR *Path)

{

     WIN32_FIND_DATA wfd, *arwfd;

     int wfdsize,n,i;

     BOOL bResult=TRUE;

     BOOL Result=TRUE;

     HINTERNET hFind;

 

     FtpSetCurrentDirectory(hFtp,Path);

 

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

     if (hFind==NULL) {

          FtpSetCurrentDirectory(hFtp,"..");

          return FALSE;

     }

     wfdsize=100;

     arwfd=(WIN32_FIND_DATA *)malloc(wfdsize*sizeof(WIN32_FIND_DATA));

     for (n=0;bResult;n++) {

          if (wfdsize >= n) {

              wfdsize+=100;

              arwfd=(WIN32_FIND_DATA *)realloc(arwfd,wfdsize*sizeof(WIN32_FIND_DATA));

          }

          arwfd[n]=wfd;

          bResult=InternetFindNextFile(hFind,&wfd);

     }

     InternetCloseHandle(hFind);

 

     for (i=0;i<n;i++) {

          if (arwfd[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {

              if (FtpDeleteFolder(arwfd[i].cFileName)==FALSE) {

                   Result=FALSE;

                   break;

              }

          } else {

              if (FtpDeleteFile(hFtp,arwfd[i].cFileName)==FALSE) {

                   Result=FALSE;

                   break;

              }

          }

     }

     free(arwfd);

 

     // »óÀ§ µð·ºÅ丮·Î À̵¿ÇÑ ÈÄ ÀÚ±â ÀڽŠ»èÁ¦

     FtpSetCurrentDirectory(hFtp,"..");

     if (FtpRemoveDirectory(hFtp,Path)==FALSE) {

          Result=FALSE;

     }

     return Result;

}

 

º¹¼ö °³ÀÇ ÆÄÀϰú Æú´õ¸¦ ÇѲ¨¹ø¿¡ »èÁ¦ÇÒ ¼ö Àֱ⠶§¹®¿¡ ´Ù¼Ò º¹ÀâÇÏ¸ç Æú´õ ±¸Á¶°¡ °èÃþÀûÀ̱⠶§¹®¿¡ Àç±Í È£ÃâÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ¿ø°ÝÁöÀÇ ÆÄÀÏ »èÁ¦´Â ´ë´ÜÈ÷ À§ÇèÇϱ⠶§¹®¿¡ È®ÀÎ °úÁ¤À» °ÅÄ£´Ù. ¸®½ºÆ® ºäÀÇ ¼±ÅÃµÈ ÆÄÀϵéÀ» ¼øÈ¸ÇÏ¸ç ÆÄÀÏÀº FtpDeleteFile ÇÔ¼ö·Î »èÁ¦ÇÏ°í Æú´õ´Â FtpDeleteFolder ÇÔ¼ö·Î »èÁ¦ÇÑ´Ù. ºñ¾î ÀÖÁö ¾ÊÀº Æú´õ´Â »èÁ¦µÇÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ¾ÈÀ¸·Î µé¾î°¡ Æú´õÀÇ ¸ðµç ÆÄÀϰú ¼­ºê Æú´õ¸¦ ´Ù »èÁ¦ÇØ¾ß ÇÑ´Ù.

FtpDeleteFolder ÇÔ¼ö´Â Àç±ÍÀûÀÎ ±¸Á¶¸¦ °¡Áö°í ÀÖ´Ù. ¿ì¼± Æú´õ ¾ÈÀ¸·Î µé¾î°¡ ÀÌ Æú´õ¿¡ Æ÷ÇÔµÈ ¸ðµç ÆÄÀÏÀ» °Ë»öÇÑ´Ù. ÆÄÀÏ¿¡ ´ëÇØ¼­´Â FtpDeleteFile ÇÔ¼ö¸¦ È£ÃâÇÏ°í Æú´õ¿¡ ´ëÇØ¼­´Â ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÑ´Ù. ´Ù »èÁ¦ÇÑ ÈÄ »óÀ§ Æú´õ·Î À̵¿ÇÏ¿© ¸¶Áö¸·À¸·Î ÀÚ±â ÀÚ½ÅÀ» »èÁ¦ÇÏ°í ¸®ÅÏÇÑ´Ù.

¸ñ·ÏÀ» ¸ÕÀú arwfd ¹è¿­¿¡ Á¶»çÇØ ³õ°í »èÁ¦¸¦ Çϴµ¥ FtpFindFirstFileÀº ¿¬°á Çϳª¿¡ ´ëÇØ Çѹø ÀÌ»ó È£ÃâÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ ¸ñ·ÏÀ» ¿ÏÀüÈ÷ Á¶»çÇÏ¿© hFind ÇÚµéÀ» ´ÝÀº ÈÄ¿¡¾ß ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÒ ¼ö ÀÖ´Ù. arwfd ¹è¿­Àº ÃÖÃÊ 100ÀÇ Å©±â·Î ÇÒ´çµÇ¾ú´Ù°¡ ÇÊ¿äÇѸ¸Å­ Ãß°¡·Î ÀçÇÒ´çµÈ´Ù. Del ´ÜÃà۰¡ Áö¿øµÇ¹Ç·Î °£ÆíÇÏ°Ô »èÁ¦ÇÒ ¼ö ÀÖ´Ù.

¶ó.´Ù¿î·Îµå

´Ù¿î·Îµå´Â ÅØ½ºÆ® ÆíÁý±â¿¡ ²À ÇÊ¿äÇÑ ±â´ÉÀº »ç½Ç ¾Æ´Ï´Ù. ±×·¯³ª ¾ÆÁÖ Å« ÆÄÀÏÀ» ´Ù¿î·Îµå ¹Þ¾Æ¼­ ÆíÁýÇѴٰųª ÇÒ °æ¿ì¿¡ ÀÌ ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ ¼¼ ÇÔ¼ö·Î ±¸ÇöÇÑ´Ù.

 

void FtpDownLoad(HWND hDlg,HWND hList)

{

     int iItem;

     LVITEM LI;

     TCHAR Path[MAX_PATH];

     TCHAR DownPath[MAX_PATH];

     TCHAR szSize[16];

 

     if (BrowseFolder(hDlg,"³»·Á¹ÞÀº ÆÄÀÏÀ» ÀúÀåÇÒ Æú´õ¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ",

          "c:\\",DownPath)==FALSE) {

          return;

     }

 

     // ÁøÇàÁß ´ëÈ­»óÀÚ Ç¥½Ã

     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(hDlg, FALSE);

 

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

     while (iItem!=-1) {

          LI.iItem=iItem;

          LI.iSubItem=0;

          LI.pszText=Path;

          LI.cchTextMax=MAX_PATH;

          LI.mask=LVIF_IMAGE | LVIF_TEXT;

          ListView_GetItem(hList,&LI);

          // ·çÆ®´Â ¼±ÅõǾî À־ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù.

          if (LI.iImage==0) {

              if (FtpDownLoadFolder(Path,DownPath)==FALSE) {

                   break;

              }

          } else if (LI.iImage==1) {

              // Å©±â´Â Á÷Á¢ ±¸ÇØ Áà¾ß ÇÑ´Ù. FtpFirstFileÀº Çѹø¹Û¿¡ È£Ãâ ¸øÇÔ

              ListView_GetItemText(hList,iItem,2,szSize,16);

              if (FtpDownLoadFile(Path,DownPath,atoi(szSize))==FALSE) {

                   break;

              }

          }

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

     }

 

     EnableWindow(hDlg, TRUE);

     DestroyWindow(hDlgDown);

}

 

BOOL FtpDownLoadFile(TCHAR *Path,TCHAR *DownPath,unsigned FileSize)

{

     HINTERNET hRemote=NULL;

     TCHAR tPath[MAX_PATH];

     HANDLE hLocal=INVALID_HANDLE_VALUE;

     DWORD Size,DnSize=0;

     DWORD dwRead,dwWritten;

     BOOL Result=FALSE;

     PVOID pbuf=NULL;

     MSG msg;

     DWORD OldTick;

     TCHAR Mes[MAX_PATH+64];

 

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

     if (hRemote == NULL) {

          Result=FALSE;

          goto EndDown;

     }

 

     if (lstrlen(DownPath)==3) {

          DownPath[2]=0;

     }

     wsprintf(tPath,"%s\\%s",DownPath,Path);

     hLocal=CreateFile(tPath,GENERIC_WRITE,0,NULL,

          CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hLocal==INVALID_HANDLE_VALUE) {

          Result=FALSE;

          goto EndDown;

     }

 

     wsprintf(Mes,"´ë»ó ÆÄÀÏ : %s",Path);

     SetDlgItemText(hDlgDown,IDC_STDOWN1,Mes);

 

     OldTick=GetTickCount();

     for (;;) {

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

          if (pbuf==NULL || _msize(pbuf) < Size) {

              pbuf=(PVOID)realloc(pbuf,Size);

          }

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

          if (Result==FALSE) {

              goto EndDown;

          }

          if (bContDown==FALSE) {

              Result=FALSE;

              goto EndDown;

          }

          if (dwRead==0) {

              goto EndDown;

          }

          WriteFile(hLocal,pbuf,dwRead,&dwWritten,NULL);

          DnSize+=dwRead;

 

          // ³Ê¹« ÀÚÁÖ °»½ÅÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.

          if (GetTickCount()!=OldTick) {

              SendMessage(hDlgDown,WM_USER+1,(WPARAM)DnSize,(LPARAM)FileSize);

              OldTick=GetTickCount();

          }

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

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

                   TranslateMessage(&msg);

                   DispatchMessage(&msg);

              }

          }

     }

 

EndDown:

     if (hRemote) InternetCloseHandle(hRemote);

     if (hLocal != INVALID_HANDLE_VALUE) CloseHandle(hLocal);

     if (pbuf) free(pbuf);

     return Result;

}

 

BOOL FtpDownLoadFolder(TCHAR *Path,TCHAR *DownPath)

{

     WIN32_FIND_DATA wfd, *arwfd;

     int wfdsize,n,i;

     BOOL bResult=TRUE;

     BOOL Result=TRUE;

     HINTERNET hFind;

     TCHAR NewPath[MAX_PATH];

 

     // µð·ºÅ丮 ¾ÈÀ¸·Î µé¾î°¡°í ·ÎÄÿ¡ Æú´õ¸¦ ¸¸µç´Ù.

     FtpSetCurrentDirectory(hFtp,Path);

     if (lstrlen(DownPath)==3) {

          wsprintf(NewPath,"%s%s",DownPath,Path);

     } else {

          wsprintf(NewPath,"%s\\%s",DownPath,Path);

     }

     CreateDirectory(NewPath,NULL);

 

     // ÀÏ´Ü ÀüºÎ ¼øÈ¸Çϸ鼭 ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

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

     if (hFind==NULL) {

          FtpSetCurrentDirectory(hFtp,"..");

          return FALSE;

     }

     wfdsize=100;

     arwfd=(WIN32_FIND_DATA *)malloc(wfdsize*sizeof(WIN32_FIND_DATA));

     for (n=0;bResult;n++) {

          if (wfdsize >= n) {

              wfdsize+=100;

              arwfd=(WIN32_FIND_DATA *)realloc(arwfd,wfdsize*sizeof(WIN32_FIND_DATA));

          }

          arwfd[n]=wfd;

          bResult=InternetFindNextFile(hFind,&wfd);

     }

     InternetCloseHandle(hFind);

 

     for (i=0;i<n;i++) {

          if (arwfd[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {

              if (FtpDownLoadFolder(arwfd[i].cFileName,NewPath)==FALSE) {

                   Result=FALSE;

                   break;

              }

          } else {

              if (FtpDownLoadFile(arwfd[i].cFileName,NewPath,arwfd[i].nFileSizeLow)==FALSE) {

                   Result=FALSE;

                   break;

              }

          }

     }

     free(arwfd);

 

     // »óÀ§ µð·ºÅ丮·Î ´Ù½Ã À̵¿

     FtpSetCurrentDirectory(hFtp,"..");

     return Result;

}

 

´Ù¿î·Îµå ¹ÞÀ» ·ÎÄà µå¶óÀ̺꿡 ´ëÇÑ À¯Àú ÀÎÅÍÆäÀ̽º°¡ ¾ø±â ¶§¹®¿¡ Æú´õ ¼±Åà ´ëÈ­»óÀÚ¸¦ º¸¿© ÁÖ°í ´Ù¿î·Îµå ¹ÞÀ» À§Ä¡¸¦ ÀԷ¹޴´Ù. ºÒÆíÇÑ ¸éÀÌ ÀÖ±â´Â ÇÏÁö¸¸ Àü¹®ÀûÀÎ FTP Ŭ¶óÀÌ¾ðÆ®°¡ ¾Æ´Ï¹Ç·Î °£ÆíÇÔÀ» À§ÁÖ·Î ¼³°èÇß´Ù. ·ÎÄà µå¶óÀ̺êÀÇ ¸ñ·ÏÀ» °ü¸®ÇÏ·Á¸é ÆÄÀÏâÀÇ Äڵ尡 ÇÊ¿äÇѵ¥ ¾Ë´Ù½ÃÇÇ ¾ÆÁÖ ºÐ·®ÀÌ ¸¹´Ù. ´Ù¿î·Îµå´Â ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷À̹ǷΠ´Ù¿î·Îµå ´ëÈ­»óÀÚ¸¦ º¸¿©ÁØ´Ù. ÀÌ ´ëÈ­»óÀÚÀÇ ÇÚµéÀº hDlgDownÀº ¿©·¯ ÇÔ¼ö¿¡¼­ ÂüÁ¶ÇØ¾ß ÇϹǷΠÀü¿ª º¯¼ö·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. Internet.cppÀÇ ¼±µÎ¿¡ ÀÌ À©µµ¿ìÀÇ ÇÚµéÀ» Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.

 

#include "stdafx.h"

 

static HWND hDlgDown;

 

´Ù¸¥ ¸ðµâ¿¡¼­´Â »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î staticÀ¸·Î ¼±¾ðÇÏ´Â °ÍÀÌ ÁÁ´Ù. DgHttpDown, DgFtpDown, DgFtpUp ÇÔ¼ö¿¡ ¼±¾ðµÈ Áö¿ª º¯¼ö´Â »èÁ¦ÇÑ´Ù. ¸®½ºÆ®ÀÇ ¼±ÅÃµÈ Ç׸ñµéÀ» ÀüºÎ ¼øÈ¸Çϸ鼭 ´Ù¿î·Îµå ¹Þ´Â´Ù. ÆÄÀÏ¿¡ ´ëÇØ¼­´Â FtpDownLoadFile ÇÔ¼ö¸¦, Æú´õ¿¡ ´ëÇØ¼­´Â FtpDownLoadFolder ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

ÆÄÀÏ ´Ù¿î·Îµå´Â ¿ø°ÝÁöÀÇ ÆÄÀÏ ¿­°í, °°Àº À̸§À¸·Î ·ÎÄÃÀÇ ÆÄÀÏÀ» »ý¼ºÇÑ ÈÄ ¿ø°ÝÁö¿¡¼­ ÀÐ¾î ·ÎÄÿ¡ ½á ³Ö±â¸¦ ÆÄÀÏ ³¡±îÁö ¹Ýº¹ÇÏ¸é µÈ´Ù. ´Ù¿î·Îµå ´ëÈ­»óÀÚ¿¡ ÁøÇà °úÁ¤À» º¸¿©ÁÖµÇ ·çÇÁ°¡ ±²ÀåÈ÷ »¡¸® µ¹¾Æ°¡¹Ç·Î ¸Å¹ø ¾÷µ¥ÀÌÆ®ÇÒ ÇÊ¿ä¾øÀÌ Æ½ Ä«¿îÆ®°¡ Çѹø Áõ°¡ÇÒ ¶§¸¶´Ù Çѹø¾¿ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. ³Ê¹« ÀÚÁÖ ¾÷µ¥ÀÌÆ®ÇÏ¸é ±ô¹ÚÀÓÀÌ ½ÉÇÏ´Ù. Æú´õ ´Ù¿î·Îµå´Â »èÁ¦¿Í ¸¶Âù°¡Áö·Î Àç±ÍÀûÀÌ´Ù. ¸ñ·ÏÀ» ¸ÕÀú Á¶»çÇϰí ÇѲ¨¹ø¿¡ ´Ù¿î·ÎµåÇØ¾ß ÇÑ´Ù. ¼­ºê Æú´õÀÇ °æ¿ì ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÑ´Ù.

¸¶.¾÷·Îµå

¾÷·ÎµåÇÒ ´ë»óÀ» ¼±ÅÃÇÏ´Â ·ÎÄà µå¶óÀÌºê ¸ñ·ÏÀÌ ¾øÀ¸¹Ç·Î Ž»ö±â¸¦ ´ë½Å »ç¿ëÇϱâ·Î ÇÑ´Ù. Ž»ö±â¿¡¼­ µå·¡±×ÇÏ¿© ÀÌ ´ëÈ­»óÀÚ·Î ¶³¾î¶ß¸®¸é ÇØ´ç ÆÄÀÏÀ» ¾÷·ÎµåÇÑ´Ù. WM_INITDIALOG¿¡¼­ DrawAcceptFiles ÇÔ¼ö¸¦ È£ÃâÇÏ¿© µå·¡±×¹Þ°Ú´Ù´Â ¼±¾ðÀ» Çϰí WM_DROPFILES ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ FtpUpLoad ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void FtpUpLoad(HWND hDlg,HWND hList,HDROP hDrop)

{

     TCHAR Path[MAX_PATH];

     int Count,n;

 

     // ÁøÇàÁß ´ëÈ­»óÀÚ Ç¥½Ã

     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(hDlg, FALSE);

 

     Count=DragQueryFile(hDrop,0xffffffff,NULL,0);

     for (n=0;n<Count;n++) {

          DragQueryFile(hDrop,n,Path,MAX_PATH);

          if (GetFileAttributes(Path) & FILE_ATTRIBUTE_DIRECTORY) {

              if (FtpUpLoadFolder(Path)==FALSE) {

                   break;

              }

          } else {

              if (FtpUpLoadFile(Path)==FALSE) {

                   break;

              }

          }

     }

     EnableWindow(hDlg, TRUE);

     DestroyWindow(hDlgDown);

     DgFtpEnumFiles(hDlg);

}

 

BOOL FtpUpLoadFile(TCHAR *Path)

{

     HINTERNET hRemote=NULL;

     HANDLE hLocal=INVALID_HANDLE_VALUE;

     DWORD FileSize,Size, RemSize;

     DWORD dwRead,dwWritten;

     BOOL Result=FALSE;

     PVOID pbuf=NULL;

     MSG msg;

     DWORD OldTick;

     TCHAR Mes[MAX_PATH+64];

     TCHAR Ext[_MAX_EXT];

     TCHAR Name[MAX_PATH];

 

     hLocal=CreateFile(Path,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hLocal==INVALID_HANDLE_VALUE) {

          Result=FALSE;

          goto EndUp;

     }

    

     _splitpath(Path,NULL,NULL,Name,Ext);

     lstrcat(Name,Ext);

     hRemote=FtpOpenFile(hFtp,Name,GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY,0);

     if (hRemote == NULL) {

          Result=FALSE;

          goto EndUp;

     }

 

     wsprintf(Mes,"´ë»ó ÆÄÀÏ : %s",Path);

     SetDlgItemText(hDlgDown,IDC_STDOWN1,Mes);

 

     FileSize=RemSize=GetFileSize(hLocal,NULL);

     pbuf=malloc(10000);

     OldTick=GetTickCount();

     for (;;) {

          Size=min(10000,RemSize);

          if (Size==0) {

              Result=TRUE;

              break;

          }

          ReadFile(hLocal,pbuf,Size,&dwRead,NULL);

          Result=InternetWriteFile(hRemote,pbuf,Size,&dwWritten);

          if (Result==FALSE) {

              Result=FALSE;

              goto EndUp;

          }

          if (bContDown==FALSE) {

              Result=FALSE;

              goto EndUp;

          }

          RemSize-=dwWritten;

          // ³Ê¹« ÀÚÁÖ °»½ÅÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.

          if (GetTickCount()!=OldTick) {

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

              OldTick=GetTickCount();

          }

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

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

                   TranslateMessage(&msg);

                   DispatchMessage(&msg);

              }

          }

     }

 

EndUp:

     if (hRemote) InternetCloseHandle(hRemote);

     if (hLocal != INVALID_HANDLE_VALUE) CloseHandle(hLocal);

     if (pbuf) free(pbuf);

     return Result;

}

 

BOOL FtpUpLoadFolder(TCHAR *Path)

{

     WIN32_FIND_DATA wfd;

     BOOL bResult=TRUE;

     BOOL Result=TRUE;

     TCHAR SrchPath[MAX_PATH];

     TCHAR NewPath[MAX_PATH];

     TCHAR Ext[_MAX_EXT];

     TCHAR Name[MAX_PATH];

     HANDLE hFind;

 

     // ·ÎÄà Æú´õ °Ë»ö ½ÃÀÛ

     wsprintf(SrchPath,"%s\\*.*",Path);

     hFind=FindFirstFile(SrchPath,&wfd);

     if (hFind == INVALID_HANDLE_VALUE) {

          return FALSE;

     }

 

     // Æú´õ¸¦ ¸¸µé°í ¾ÈÀ¸·Î µé¾î°£´Ù.

     _splitpath(Path,NULL,NULL,Name,Ext);

     lstrcat(Name,Ext);

     FtpCreateDirectory(hFtp,Name);

     FtpSetCurrentDirectory(hFtp,Name);

 

     while (bResult) {

          wsprintf(NewPath,"%s\\%s",Path,wfd.cFileName);

          if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {

              if (wfd.cFileName[0]!='.') {

                   if (FtpUpLoadFolder(NewPath)==FALSE) {

                        Result=FALSE;

                        break;

                   }

              }

          } else {

              if (FtpUpLoadFile(NewPath)==FALSE) {

                   Result=FALSE;

                   break;

              }

          }

          bResult=FindNextFile(hFind,&wfd);

     }

     FindClose(hFind);

 

     // »óÀ§ µð·ºÅ丮·Î ´Ù½Ã À̵¿

     FtpSetCurrentDirectory(hFtp,"..");

     return Result;

}

 

ÀüüÀûÀÎ ±¸Á¶´Â ´Ù¿î·Îµå¿Í °ÅÀÇ À¯»çÇÏ´Ù. ´Ù¸¸ ·ÎÄà ÆÄÀÏ¿¡ ´ëÇØ Àç±ÍÀûÀΠȣÃâÀ» ÇϹǷΠ¸ñ·ÏÀ» µû·Î ¸ÕÀú Á¶»çÇÒ Çʿ䰡 ¾ø´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.