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
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.pszText="Å©±â";
COL.cx=80;
COL.iSubItem=1;
ListView_InsertColumn(hList,1,&
COL.cx=150;
COL.pszText="³¯Â¥";
COL.iSubItem=2;
ListView_InsertColumn(hList,2,&
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,
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,
{
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¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ÀÌ ÇÔ¼öÀÇ ³»¿ëÀº ¾î·ÆÁö ¾Ê°Ô ÆľÇÇÒ ¼ö ÀÖÀ¸¹Ç·Î µû·Î »ó¼¼ÇÑ ºÐ¼®Àº ÇÏÁö ¾Ê´Â´Ù.
Æú´õÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â ¹æ¹ýÀº ÆÄÀÏâÀÌ ·ÎÄà µå¶óÀ̺êÀÇ ÆÄÀÏ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â ¹æ¹ý°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. ¾ËÆĺª¼øÀ¸·Î Á¤·ÄÇؼ º¸¿©ÁÖµÇ Æú´õ¸¦ ¿ì¼±ÀûÀ¸·Î º¸¿©ÁÖ°í Æú´õ ´ÙÀ½¿¡ ÆÄÀÏÀÇ ¸ñ·ÏÀ» º¸¿©ÁØ´Ù.