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