版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
78/79《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)課題名稱課題名稱FTP客戶機(jī)搭建學(xué)院信息工程學(xué)院專業(yè)網(wǎng)絡(luò)工程班級(jí)學(xué)號(hào)姓名目錄和索引一、需求分析21、功能需求2、開發(fā)環(huán)境與工具3、所需要知識(shí)二、知識(shí)理解21、FTP實(shí)現(xiàn)的基本原理(1)概要(2)上傳和下載(3)用戶FTP和匿名FTP(4)ASCII和Binary(5)Port和Passive三、完成進(jìn)度31、已完成部分2、未完成部分3、還需改善的部分四、FTP服務(wù)工作過程4五、詳細(xì)設(shè)計(jì)51、CFtpDlg類的一些函數(shù)定義………………52、CFtpOperate的一些函數(shù)定義……………17六、測(cè)試結(jié)果29七、用戶手冊(cè)32八、實(shí)驗(yàn)總結(jié)32FTP客戶端程序一、需求分析1、功能需求(1)實(shí)現(xiàn)一個(gè)圖形用戶界面的FTP客戶端,保證文件的安全傳輸和存儲(chǔ)。(2)提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面。(3)通過輸入服務(wù)器地址、用戶名和密碼,可以實(shí)現(xiàn)遠(yuǎn)程FTP主機(jī)的登錄。(4)提供本地文件和文件夾的上傳功能,可對(duì)FTP主機(jī)文件進(jìn)行下載和刪除文件。(5)提供對(duì)本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄服務(wù)器前可以作為一個(gè)簡(jiǎn)單的文件查詢工具對(duì)本地文件進(jìn)行查詢。(6)幫助頁(yè)面可以對(duì)用戶提供使用說明。(7)關(guān)于界面包含設(shè)計(jì)者的信息。(9)要求開發(fā)出的FTP客戶端符合標(biāo)準(zhǔn)FTP協(xié)議規(guī)范,支持ASCII傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式(10)FTP的兩種工作模式的選擇Port模式(主動(dòng))和Passive模式(被動(dòng))2、開發(fā)環(huán)境與工具(1)使用的IDE:使用VC++6.0作為開發(fā)環(huán)境IDE(2)使用的語(yǔ)言:C++(3)使用的開發(fā)包:使用MFC和WinInet(4)開發(fā)平臺(tái):Windows73、所需要知識(shí)(1)計(jì)算機(jī)網(wǎng)絡(luò)的基本知識(shí)(2)了解FTP基本實(shí)現(xiàn)原理(2)使用VC++6.0IDE進(jìn)行MFC程序開發(fā)的基本知識(shí)(3)熟悉WinInet中屬于FTP部分的操作(4)熟悉文件或文件夾操作(5)熟悉控件的操作,如在ListCtrol添加圖片(瀏覽文件或文夾的圖標(biāo))二、知識(shí)理解1、FTP實(shí)現(xiàn)的基本原理(1)概要Internet是一個(gè)非常復(fù)雜的計(jì)算機(jī)環(huán)境,Internet上的計(jì)算機(jī)已有上千萬臺(tái),而這些計(jì)算機(jī)可能運(yùn)行不同的操作系統(tǒng),有運(yùn)行Unix的服務(wù)器,也有運(yùn)行Dos、Windows的PC機(jī)等等,而各種操作系統(tǒng)之間的文件交流問題,需要建立一個(gè)統(tǒng)一的文件傳輸協(xié)議,這就是所謂的FTP?;诓煌牟僮飨到y(tǒng)有不同的FTP應(yīng)用程序,而所有這些應(yīng)用程序都遵守同一種協(xié)議,這樣用戶就可以把自己的文件傳送給別人,或者從其它的用戶環(huán)境中獲得文件。FTP也是一個(gè)客戶機(jī)/服務(wù)器系統(tǒng)。用戶通過一個(gè)支持FTP協(xié)議的客戶機(jī)程序,連接到在遠(yuǎn)程主機(jī)上的FTP服務(wù)器程序。用戶通過客戶機(jī)程序向服務(wù)器程序發(fā)出命令,服務(wù)器程序執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結(jié)果返回到客戶機(jī)。使用FTP時(shí)必須首先登錄,在遠(yuǎn)程主機(jī)上獲得相應(yīng)的權(quán)限以后,方可下載或上傳文件。(2)上傳和下載"下載"文件就是從遠(yuǎn)程主機(jī)拷貝文件至自己的計(jì)算機(jī)上;"上傳"文件就是將文件從自己的計(jì)算機(jī)中拷貝至遠(yuǎn)程主機(jī)上(3)用戶FTP和匿名FTP用戶FTP:種方式為已在FTP服務(wù)器上建立了特定帳號(hào)的用戶使用,需要合法的用戶名和密碼才能登錄到遠(yuǎn)程計(jì)算機(jī)傳輸文件。匿名FTP:用戶作為“anonymous”登錄到FTP服務(wù)器,不需要有自己的用戶名和密碼。(4)ASCII和BinaryASCII:文本傳輸器使用ASCII字符,并由回車鍵和換行符分開Binary:二進(jìn)制不用轉(zhuǎn)換或格式化就可傳字符,二進(jìn)制模式比文本模式更快,并且可以傳輸所有ASCII值,所以系統(tǒng)管理員一般將FTP設(shè)置成二進(jìn)制模式。(5)Port和PassivePort模式(主動(dòng)):FTP客戶端首先和FTP服務(wù)器的TCP21端口建立連接,通過這個(gè)通道發(fā)送命令,客戶端需要接收數(shù)據(jù)的時(shí)候在這個(gè)通道上發(fā)送PORT命令。PORT命令包含了客戶端用什么端口接收數(shù)據(jù)。在傳送數(shù)據(jù)的時(shí)候,服務(wù)器端通過自己的TCP20端口連接至客戶端的指定端口發(fā)送數(shù)據(jù)。FTPserver必須和客戶端建立一個(gè)新的連接用來傳送數(shù)據(jù)。Passive模式(被動(dòng)):Passive模式在建立控制通道的時(shí)候和Standard模式類似,但建立連接后發(fā)送的不是Port命令,而是Pasv命令。FTP服務(wù)器收到Pasv命令后,隨機(jī)打開一個(gè)高端端口(端口號(hào)大于1024)并且通知客戶端在這個(gè)端口上傳送數(shù)據(jù)的請(qǐng)求,客戶端連接FTP服務(wù)器此端口,然后FTP服務(wù)器將通過這個(gè)端口進(jìn)行數(shù)據(jù)的傳送,這個(gè)時(shí)候FTPserver不再需要建立一個(gè)新的和客戶端之間的連接。三、完成進(jìn)度1、已完成部分(1)實(shí)現(xiàn)一個(gè)圖形用戶界面的FTP客戶端,保證文件的安全傳輸和存儲(chǔ)。(2)提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面(3)通過輸入服務(wù)器地址、用戶名和密碼,可以實(shí)現(xiàn)遠(yuǎn)程FTP主機(jī)的登錄。(4)提供本地文件上傳功能,可對(duì)FTP主機(jī)文件進(jìn)行下載和刪除文件。(5)提供對(duì)本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄服務(wù)器前可以作為一個(gè)簡(jiǎn)單的文件查詢工具對(duì)本地文件進(jìn)行查詢。(6)幫助頁(yè)面可以對(duì)用戶提供使用說明。(7)關(guān)于界面包含設(shè)計(jì)者的信息(幫助界面和關(guān)于界面整合在一起)。(9)支持ASCII傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式,外加自動(dòng)選擇的模式(10)FTP的兩種工作模式的選擇Port模式(主動(dòng))和Passive模式(被動(dòng))(11)提供用戶操作的狀態(tài)信息輸出2、未完成部分只提供了本地文件的上傳功能,暫時(shí)不能提供文件夾的上傳功能,由于當(dāng)初沒有使用多線程對(duì)服務(wù)器端進(jìn)行操作,若上傳或下載的文件過大,會(huì)導(dǎo)致界面陷入長(zhǎng)時(shí)間的不響應(yīng)中。由于時(shí)間問題,就不再進(jìn)行多線程的擴(kuò)充,也就不提供文件夾的上傳功能。3、還需改善的部分(1)使用多線程進(jìn)行操作(2)提供文件夾上傳和文件夾下載功能(3)改進(jìn)界面,提供更方便的操作(4)增加上傳和下載的隊(duì)列(5)同時(shí)可連接多個(gè)FTP服務(wù)器(6)改善提示信息(7)賬戶。密碼等用戶資料在本地加密后保存(8)增加更多的功能,如下載完成后關(guān)機(jī)等(9)等………四、FTP服務(wù)工作程 五、詳細(xì)設(shè)計(jì)(1)CFtpDlg類的一些函數(shù)定義BOOLCFtpDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } SetIcon(m_hIcon,TRUE); SetIcon(m_hIcon,FALSE); m_ctrBinary.SetCheck(1);m_ctrActive.SetCheck(1);m_editPort.SetWindowText("21"); bBinary1=1;//使用二進(jìn)制bPassive1=0;//使用主動(dòng)myPort=21; m_imgList.Create(20,20,ILC_COLOR32,0,0);//創(chuàng)建圖像列表m_imgList.SetBkColor(RGB(255,255,255));//文件夾圖標(biāo)hIconFold=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_FOLDER));//文件圖標(biāo)hIconFile=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_FILE)); m_imgList.Add(hIconFold);m_imgList.Add(hIconFile);m_ctrlLocalFile.SetImageList(&m_imgList,LVSIL_SMALL);//關(guān)聯(lián)m_ctrlServerFile.SetImageList(&m_imgList,LVSIL_SMALL);//關(guān)聯(lián) m_editServer.SetWindowText("ftp://"); m_editName.SetWindowText(""); m_editPassword.SetWindowText(""); m_btnCon.EnableWindow(TRUE); m_btnClo.EnableWindow(FALSE); m_ctrlLocalFile.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_ctrlServerFile.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_ctrlLocalFile.InsertColumn(0,"文件名",LVCFMT_LEFT,140,0);//設(shè)置列m_ctrlLocalFile.InsertColumn(1,"文件類型",LVCFMT_LEFT,100,1);m_ctrlLocalFile.InsertColumn(2,"修改日期",LVCFMT_LEFT,100,2); m_ctrlServerFile.InsertColumn(0,"文件名",LVCFMT_LEFT,140,0);//設(shè)置列m_ctrlServerFile.InsertColumn(1,"文件類型",LVCFMT_LEFT,100,1);m_ctrlServerFile.InsertColumn(2,"修改日期",LVCFMT_LEFT,100,2); //添加硬盤盤符 size_tszAllDriveStrings=::GetLogicalDriveStrings(0,NULL); TCHAR*pDriveStrings=newTCHAR[szAllDriveStrings+sizeof(_T(""))]; GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings); size_tszDriveString=::strlen(pDriveStrings); while(szDriveString>0) { m_ctrlLocal.AddString(pDriveStrings); pDriveStrings+=szDriveString+1; szDriveString=::strlen(pDriveStrings); } intindex=m_ctrlLocal.FindString(0,"c:\\"); m_ctrlLocal.SetCurSel(index); m_strLocPath="c:\\";//初始化為c盤 ListLocFile(); cFtpOpr.setEidt(&m_ediMessage); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCFtpDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}voidCFtpDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}HCURSORCFtpDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}//連接服務(wù)器voidCFtpDlg::OnBtnConnect(){ //TODO:Addyourcontrolnotificationhandlercodeherem_editServer.GetWindowText(m_strServer);//記錄FTP服務(wù)器地址 CStringstrtemp; m_editPort.GetWindowText(strtemp); myPort=::atoi(strtemp);//獲得設(shè)置的端口號(hào) inti; if(bAnony==0) {//不使用匿名 m_editName.GetWindowText(m_strName);//記錄FTP登陸用戶名 m_editPassword.GetWindowText(m_strPassword);//記錄FTP登陸用戶密碼 i=cFtpOpr.set(m_strServer,m_strName,m_strPassword); } else {//使用匿名 CStringstrNameTemp; m_editName.GetWindowText(strNameTemp);//匿名登陸的用戶名 i=cFtpOpr.set(m_strServer,strNameTemp,""); } if(i) {//設(shè)置成功,打開連接if(cFtpOpr.OpenConnection()) {//連接成功 m_btnClo.EnableWindow(TRUE); m_btnCon.EnableWindow(FALSE); UpdateServerFile();//更新服務(wù)器的文件顯示 m_ctrlServer.ResetContent(); CStringtemp; cFtpOpr.GetPath(temp); m_ctrlServer.AddString((LPSTR)(LPCTSTR)temp);m_ctrlServer.SetCurSel(0); m_chkAnony.EnableWindow(FALSE); m_ctrActive.EnableWindow(FALSE); CButton*temp2=(CButton*)GetDlgItem(IDC_PASSIVE); temp2->EnableWindow(FALSE); m_editPort.EnableWindow(FALSE);} else { //連接失敗 } }}voidCFtpDlg::OnBtnClose(){//關(guān)閉連接 if(cFtpOpr.CloseConnection()) {//關(guān)閉成功 m_btnClo.EnableWindow(FALSE); m_btnCon.EnableWindow(TRUE); m_ctrlServerFile.DeleteAllItems(); m_ctrlServer.ResetContent(); m_ctrActive.EnableWindow(TRUE); CButton*temp2=(CButton*)GetDlgItem(IDC_PASSIVE); temp2->EnableWindow(TRUE); m_editPort.EnableWindow(TRUE); m_chkAnony.EnableWindow(TRUE); }}//雙擊本地文件列表控件中的選項(xiàng)voidCFtpDlg::OnDblclkListLocalfile(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehere POSITIONp=m_ctrlLocalFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; } //獲取剛選取的位置的下標(biāo)(從0開始的) intindex=m_ctrlLocalFile.GetNextSelectedItem(p); //獲得選中的內(nèi)容 //得到第index行.第0列的內(nèi)容(下標(biāo)從0開始) CStringFirstColumn=m_ctrlLocalFile.GetItemText(index,0);CStringSecondColumn=m_ctrlLocalFile.GetItemText(index,1); if(index==0)//返回上層目錄 { intk=m_strLocPath.GetLength()-1; if(m_strLocPath.Right(2)==":\\") { return; } //刪除當(dāng)層的項(xiàng)目 intix=m_ctrlLocal.FindString(0,m_strLocPath); if(ix!=CB_ERR) { m_ctrlLocal.DeleteString(ix); } for(intj=k-1;j>=2;--j) { if(m_strLocPath.GetAt(j)=='\\') { m_strLocPath=m_strLocPath.Left(j+1); break; }} ListLocFile();*pResult=0; return; } if(SecondColumn=="文件夾") { CStringstrTemp=FirstColumn; m_strLocPath+=strTemp+'\\';ListLocFile();//更新本地磁盤文件顯示 } elseif(SecondColumn=="文件") {//點(diǎn)到的是文件,進(jìn)行上傳 if(cFtpOpr.ReStatus()==2) { cFtpOpr.PutFtpFile(m_strLocPath+FirstColumn,FirstColumn); UpdateServerFile();//更新服務(wù)器的文件顯示 } } *pResult=0;}voidCFtpDlg::OnDblclkListServerfile(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehere //獲取選中的的一個(gè)位置 POSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; } //獲取剛選取的位置的下標(biāo)(從0開始的) intindex=m_ctrlServerFile.GetNextSelectedItem(p); //獲得選中的內(nèi)容,得到第index行.第0列的內(nèi)容(下標(biāo)從0開始) CStringFirstColumn=m_ctrlServerFile.GetItemText(index,0);CStringSecondColumn=m_ctrlServerFile.GetItemText(index,1); CStringArrayServName; intnFileNumber=0; if(index==0)//返回上層目錄 { if(cFtpOpr.setBackPath()==0) { *pResult=0; return; }UpdateServerFile();//更新服務(wù)器的文件顯示 CStringtemp; m_ctrlServer.ResetContent(); cFtpOpr.GetPath(temp); m_ctrlServer.AddString((LPSTR)(LPCTSTR)temp);m_ctrlServer.SetCurSel(0);*pResult=0; return; } if(SecondColumn=="文件夾") { if(cFtpOpr.setNextPath(FirstColumn)==0) { *pResult=0; return; } UpdateServerFile();//更新服務(wù)器的文件顯示 CStringtemp; m_ctrlServer.ResetContent(); cFtpOpr.GetPath(temp); m_ctrlServer.AddString((LPSTR)(LPCTSTR)temp);m_ctrlServer.SetCurSel(0); } elseif(SecondColumn=="文件") {//點(diǎn)到的是文件,進(jìn)行下載 cFtpOpr.GetFtpFile(FirstColumn,m_strLocPath); ListLocFile(); } *pResult=0;}//將本地文件列表出來voidCFtpDlg::ListLocFile(){ m_ctrlLocalFile.DeleteAllItems(); intix=m_ctrlLocal.FindString(0,m_strLocPath);if(ix==CB_ERR) { intiy=m_ctrlLocal.GetCount();m_ctrlLocal.SetCurSel(m_ctrlLocal.AddString(m_strLocPath));} else { m_ctrlLocal.SetCurSel(m_ctrlLocal.SetCurSel(ix)); } intk=0; m_ctrlLocalFile.InsertItem(0,"...上層目錄");char*lpPath=(LPSTR)(LPCTSTR)m_strLocPath;charszFind[300];WIN32_FIND_DATAFindFileData;strcpy(szFind,lpPath);strcat(szFind,"*.*");HANDLEhFind=::FindFirstFile(szFind,&FindFileData);while(TRUE){if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY){ CStringstr=FindFileData.cFileName; if(str!='.'&&str!="..") { LVITEMlvitem; lvitem.mask=LVIF_IMAGE|LVIF_TEXT; lvitem.iItem=k+1; lvitem.pszText=(LPSTR)(LPCTSTR)str; lvitem.iImage=0; lvitem.iSubItem=0; m_ctrlLocalFile.InsertItem(&lvitem); m_ctrlLocalFile.SetItemText(k+1,1,"文件夾");++k; } }else{ //文件 LVITEMlvitem; lvitem.mask=LVIF_IMAGE|LVIF_TEXT; lvitem.iItem=k+1; lvitem.pszText=FindFileData.cFileName; lvitem.iImage=1; lvitem.iSubItem=0; m_ctrlLocalFile.InsertItem(&lvitem); m_ctrlLocalFile.SetItemText(k+1,1,"文件");++k; }if(!FindNextFile(hFind,&FindFileData))break;} FindClose(hFind);}//選擇了本地文件的組合框中的不同項(xiàng)目voidCFtpDlg::OnSelchangeComboboxexLocal(){ m_ctrlLocal.SetCurSel(m_ctrlLocal.GetCurSel()); m_ctrlLocal.GetWindowText(m_strLocPath);m_ctrlLocal.ResetContent(); //添加硬盤盤符 size_tszAllDriveStrings=::GetLogicalDriveStrings(0,NULL); TCHAR*pDriveStrings=newTCHAR[szAllDriveStrings+sizeof(_T(""))]; GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings); size_tszDriveString=::strlen(pDriveStrings); while(szDriveString>0) { m_ctrlLocal.AddString(pDriveStrings); pDriveStrings+=szDriveString+1; szDriveString=::strlen(pDriveStrings); } ListLocFile(); }//點(diǎn)擊了ASCII單選按鈕voidCFtpDlg::OnAscii(){ bBinary1=0;}//點(diǎn)擊了二進(jìn)制單選按鈕voidCFtpDlg::OnBinary(){ bBinary1=1;//使用二進(jìn)制}//自動(dòng)選擇二進(jìn)制或ASCII單選按鈕voidCFtpDlg::OnAuto(){ bBinary1=2;//自動(dòng)}//主動(dòng)方式單選按鈕voidCFtpDlg::OnActive(){ bPassive1=0;}//被動(dòng)方式單選按鈕voidCFtpDlg::OnPassive(){ bPassive1=1;}//上傳voidCFtpDlg::OnBtnup(){ POSITIONp=m_ctrlLocalFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; } //獲取剛選取的位置的下標(biāo)(從0開始的) intindex=m_ctrlLocalFile.GetNextSelectedItem(p); //獲得選中的內(nèi)容 //得到第index行.第0列的內(nèi)容(下標(biāo)從0開始) CStringFirstColumn=m_ctrlLocalFile.GetItemText(index,0);CStringSecondColumn=m_ctrlLocalFile.GetItemText(index,1); if(SecondColumn=="文件夾") { CTimeCurrentTime=CTime::GetCurrentTime(); CStringstrTime; strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond());strTime+="暫不支持上傳文件夾!\r\n"; intnLength=m_ediMessage.SendMessage(WM_GETTEXTLENGTH);m_ediMessage.SetSel(nLength,nLength);m_ediMessage.ReplaceSel(strTime); return; } elseif(SecondColumn=="文件") { //點(diǎn)到的是文件,進(jìn)行上傳 if(cFtpOpr.ReStatus()==2) { cFtpOpr.PutFtpFile(m_strLocPath+FirstColumn,FirstColumn);UpdateServerFile();//更新服務(wù)器的文件顯示 } }}//下載voidCFtpDlg::OnBtndown(){ //TODO:Addyourcontrolnotificationhandlercodehere POSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; } //獲取剛選取的位置的下標(biāo)(從0開始的) intindex=m_ctrlServerFile.GetNextSelectedItem(p); //獲得選中的內(nèi)容 //得到第index行.第0列的內(nèi)容(下標(biāo)從0開始) CStringFirstColumn=m_ctrlServerFile.GetItemText(index,0);CStringSecondColumn=m_ctrlServerFile.GetItemText(index,1); if(SecondColumn=="文件夾") { CTimeCurrentTime=CTime::GetCurrentTime(); CStringstrTime; strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond());strTime+="暫不支持下載文件夾!\r\n"; intnLength=m_ediMessage.SendMessage(WM_GETTEXTLENGTH);m_ediMessage.SetSel(nLength,nLength);m_ediMessage.ReplaceSel(strTime); return; } elseif(SecondColumn=="文件") { //點(diǎn)到的是文件,進(jìn)行下載 if(cFtpOpr.ReStatus()==2) { //點(diǎn)到的是文件,進(jìn)行下載 cFtpOpr.GetFtpFile(FirstColumn,m_strLocPath); ListLocFile();//下載完成后更新本地文件顯示 } }}//刪除服務(wù)器文件或文件夾voidCFtpDlg::OnBtndel(){ POSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; } //獲取剛選取的位置的下標(biāo)(從0開始的) intindex=m_ctrlServerFile.GetNextSelectedItem(p); //獲得選中的內(nèi)容 //得到第index行.第0列的內(nèi)容(下標(biāo)從0開始) CStringFirstColumn=m_ctrlServerFile.GetItemText(index,0);CStringSecondColumn=m_ctrlServerFile.GetItemText(index,1); if(SecondColumn=="文件夾") { if(cFtpOpr.ReStatus()==2) { //移除文件夾 cFtpOpr.DeleteFTPf(FirstColumn,0); UpdateServerFile();//更新服務(wù)器的文件顯示 } return; } elseif(SecondColumn=="文件") { if(cFtpOpr.ReStatus()==2) { //移除文件 cFtpOpr.DeleteFTPf(FirstColumn,1); UpdateServerFile();//更新服務(wù)器的文件顯示 } }}voidCFtpDlg::UpdateServerFile()//更新服務(wù)器的文件顯示{ //獲得目錄 CStringArraylocalName; intnFileNumber=0; nFileNumber=cFtpOpr.GetMultipleFileName(&localName); m_ctrlServerFile.DeleteAllItems(); m_ctrlServerFile.InsertItem(0,"...上層目錄");for(inttest=0;test<nFileNumber;test++) { CStringstTemp=localName.GetAt(test); if(stTemp.Right(5)=="<DIR>") {//文件夾 LVITEMlvitem; CStringstr=stTemp.Left(stTemp.GetLength()-5); lvitem.mask=LVIF_IMAGE|LVIF_TEXT; lvitem.iItem=test+1; lvitem.pszText=(LPSTR)(LPCTSTR)str; lvitem.iImage=0; lvitem.iSubItem=0; m_ctrlServerFile.InsertItem(&lvitem); m_ctrlServerFile.SetItemText(test+1,1,"文件夾"); } else {//文件 LVITEMlvitem; lvitem.mask=LVIF_IMAGE|LVIF_TEXT; lvitem.iItem=test+1; lvitem.pszText=(LPSTR)(LPCTSTR)stTemp; lvitem.iImage=1; lvitem.iSubItem=0; m_ctrlServerFile.InsertItem(&lvitem); m_ctrlServerFile.SetItemText(test+1,1,"文件"); } } }voidCFtpDlg::OnBtnhelp(){ CAboutDlgdlg; dlg.DoModal();}//用于屏蔽按下回車鍵程序退出的問題BOOLCFtpDlg::PreTranslateMessage(MSG*pMsg){ if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN) { returntrue; } returnCDialog::PreTranslateMessage(pMsg);}//復(fù)選框,是否匿名voidCFtpDlg::OnChkanonymous(){ if(m_chkAnony.GetCheck()) {//被選上 bAnony=1;//使用匿名 m_editName.GetWindowText(m_strName);//記錄FTP登陸用戶名,用于不使用匿名后恢復(fù) m_editPassword.GetWindowText(m_strPassword);//記錄FTP登陸用戶密碼,用于不使用匿名后恢復(fù)m_editName.SetWindowText("anonymous"); m_editPassword.SetWindowText(""); m_editName.EnableWindow(FALSE); m_editPassword.EnableWindow(FALSE); } else { bAnony=0;//不使用匿名 m_editName.SetWindowText(m_strName);//恢復(fù) m_editPassword.SetWindowText(m_strPassword);//恢復(fù) m_editName.EnableWindow(TRUE); m_editPassword.EnableWindow(TRUE); }}(2)CFtpOperate的一些函數(shù)定義//構(gòu)造函數(shù)CFtpOperate::CFtpOperate(){ strAppName.LoadString(AFX_IDS_APP_TITLE);//獲得應(yīng)用程序的名字 pInternetSession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);pEdiMes=NULL; if(!pInternetSession) { AfxMessageBox("初始化會(huì)話失敗!"); flag=-1;//初始化失敗設(shè)為-1 return; } flag=0;//初始化成功,標(biāo)志初始化為0}//析構(gòu)函數(shù)CFtpOperate::~CFtpOperate(){ pInternetSession->Close(); if(pInternetSession!=NULL) { deletepInternetSession; }}//設(shè)置,由外部調(diào)用,把數(shù)據(jù)傳進(jìn)來boolCFtpOperate::set(CStringFullURL,CStringUserName,CStringPassword){ if(flag==-1)//類實(shí)例初始化時(shí)失敗 {//重新設(shè)定strAppName.LoadString(AFX_IDS_APP_TITLE);//獲得應(yīng)用程序的名字 pInternetSession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG); if(!pInternetSession) { AfxMessageBox("初始化會(huì)話失敗!"); flag=-1;//初始化失敗設(shè)為-1 return0; } flag=0; } //flag不等于-1時(shí)才會(huì)進(jìn)行以下設(shè)置 m_strUserName=UserName;//用戶名字 m_strPassword=Password;//用戶密碼 m_strFullURL=FullURL;//設(shè)置路徑if(m_strFullURL==""||m_strUserName=="") { flag=0;} else { if(m_strFullURL.Left(6)!="ftp://") { m_strFullURL="ftp://"+m_strFullURL; } flag=1; return1; }return0; }//打開連接boolCFtpOperate::OpenConnection(){ if(flag==2) {//已連接了,先斷開 CloseConnection(); flag=1; } if(flag!=1) { AfxMessageBox("未成功進(jìn)行set調(diào)用"); return0; } CWaitCursorcursor; CStringstrTemp; strTemp="ftp://"; //解析URL if(!AfxParseURL(m_strFullURL,dwServiceType,m_strServerName,strAppName,nPort)) { CurrentTime=CTime::GetCurrentTime();strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+="無法解析FTP服務(wù)器"+m_strFullURL+"\r\n"; intnLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); flag=0; return0; } //提取path intnIndex=strTemp.GetLength()+m_strServerName.GetLength(); m_strFullPath=m_strFullURL.Right(m_strFullURL.GetLength()-nIndex);//設(shè)置服務(wù)器當(dāng)前路徑名 m_strFullPath+='/'; //解析成功后進(jìn)行連接 try { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+="準(zhǔn)備連接FTP服務(wù)器"+m_strServerName+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); //當(dāng)選擇匿名的時(shí)候,m_strUserName為anonymous,m_strPassword //不使用匿名時(shí)為用戶輸入的用戶名和密碼 if(bPassive1==1) { //使用被動(dòng)方式 pFtpConnection=pInternetSession->GetFtpConnection(m_strServerName,m_strUserName,m_strPassword, myPort,TRUE); } else { //使用主動(dòng)方式 pFtpConnection=pInternetSession->GetFtpConnection(m_strServerName,m_strUserName,m_strPassword, myPort,FALSE); }if(pFtpConnection==NULL) { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="連接失敗\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); return0;} CurrentTime=CTime::GetCurrentTime();strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+="成功連接FTP服務(wù)器"+m_strServerName+"\r\n當(dāng)前目錄為:"+m_strFullPath+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); flag=2;//連接成功后設(shè)為2 } catch(CInternetException*pEx) { TCHARszErr[1024]; pEx->GetErrorMessage(szErr,1024); TRACE(szErr); CurrentTime=CTime::GetCurrentTime();strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime=strTime+""+szErr+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); pEx->Delete(); flag=0;//連接失敗 return0; } return1;}//關(guān)閉連接boolCFtpOperate::CloseConnection(){ if(pFtpConnection==NULL) { return1; } try { pFtpConnection->Close(); } catch(...) { return0; } if(pFtpConnection!=NULL) { deletepFtpConnection; } CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="已關(guān)閉連接\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime);flag=1;//關(guān)閉成功 return1;}//返回當(dāng)前的狀態(tài)intCFtpOperate::ReStatus(){ returnflag;}//下載文件intCFtpOperate::GetFtpFile(CStringremote,CStringlocal) { if(flag!=2) {//連接未成功 return0; } CWaitCursorcursor; //initsomevar BOOLgoodfile; intx=0; CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+="下載文件,請(qǐng)稍候:"+remote+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); pFtpConnection->SetCurrentDirectory(m_strFullPath); if(bBinary1==1) { //二進(jìn)制方式 goodfile=pFtpConnection->GetFile(m_strFullPath+'/'+remote,local+remote, FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY); } else { if(bBinary1==0) {//ASCII方式 goodfile=pFtpConnection->GetFile(m_strFullPath+'/'+remote,local+remote, FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_ASCII); } elseif(bBinary1==2) {goodfile=pFtpConnection->GetFile(m_strFullPath+'/'+remote,local+remote, FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_UNKNOWN); } } if(!goodfile) { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond());strTime+="下載出錯(cuò),請(qǐng)重試\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime); return0; } else { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="下載文件成功,保存于:"+local+remote+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); } return1;}//上傳文件intCFtpOperate::PutFtpFile(CStringlocal,CStringremote){ if(flag!=2) {//連接未成功 return0; } CWaitCursorcursor; BOOLgoodfile; intx=0; pFtpConnection->SetCurrentDirectory(m_strFullPath); CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="上傳文件,請(qǐng)稍候:"+local+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); if(bBinary1==1) {//二進(jìn)制方式 goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_BINARY); } else { if(bBinary1==0) {//ASCII方式 goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_ASCII); } elseif(bBinary1==2) {//自動(dòng)方式 goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_UNKNOWN); } } if(!goodfile) { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="上傳出錯(cuò),請(qǐng)重試\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); return0; } else { CurrentTime=CTime::GetCurrentTime(); strTime.Format("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(), CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(), CurrentTime.GetSecond()); strTime+="文件:"+local+"上傳成功"+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes->SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); } return1;}intCFtpOperate::GetMultipleFileName(CStringArray*localNameArray)//localNameArray作為輸出參數(shù){ if(flag!=2) {//連接未成功 return0; } CWaitCursorcursor; BOOLgoodfile; intx=0; intnFileNumber=0; pFtpConnection->SetCurrentDirectory(m_strFullPath); CFtpFileFindfFiles(pFtpConnection); goodfile=fFiles.FindFile(m_strFullPath+"*"); if(goodfile==FALSE) { fFiles.Close(); return0; } CStringstr; while(goodfile) { goodfile=fFiles.FindNextFile(); str=fFiles.GetFileName(); if(fFiles.IsDirectory()) { str+="<DIR>"; } localNameArray->InsertAt(x,str); nFileNumber++; x++; }fFiles.Close(); //returnthenumberofmissingfile,ifany. returnnFileNumber;}//設(shè)置服務(wù)器下一層文件目錄boolCFtpOperate::setNextPath(CStringstrPath){ CStringtemp=m_strFullPath; inti=m_strFullPath.GetLength()-1; if(m_strFullPath.GetAt(i)!='/') {m_strFullPath+='/'; }m_strFullPath+=strPath+'/'; CurrentTime=CTime::Ge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國(guó)相機(jī)皮套行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024至2030年單門蒸汽蒸飯車項(xiàng)目投資價(jià)值分析報(bào)告
- 親戚在國(guó)外投資合同范本
- 年度柔印直接制版機(jī)市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 回遷安置房買賣合同范本
- 云南省耿馬縣民族中學(xué)2025屆物理高三上期中綜合測(cè)試模擬試題含解析
- 上海市嘉定區(qū)市級(jí)名校2025屆物理高三上期中學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2025屆河北省唐山遵化市高二物理第一學(xué)期期中質(zhì)量跟蹤監(jiān)視試題含解析
- 長(zhǎng)沙市重點(diǎn)中學(xué)2025屆物理高三第一學(xué)期期中調(diào)研模擬試題含解析
- 遼寧省錦州市第四中學(xué)2025屆高三物理第一學(xué)期期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 養(yǎng)老機(jī)構(gòu)服務(wù)質(zhì)量評(píng)價(jià)指標(biāo)體系的構(gòu)建
- MOOC 中國(guó)電影經(jīng)典影片鑒賞-北京師范大學(xué) 中國(guó)大學(xué)慕課答案
- MOOC 信息安全數(shù)學(xué)基礎(chǔ)-電子科技大學(xué) 中國(guó)大學(xué)慕課答案
- 嬰幼兒托育服務(wù)與管理大學(xué)職業(yè)生涯規(guī)劃
- CJT 358-2019 非開挖工程用聚乙烯管
- 5.4 核酸疫苗(mrna疫苗)
- 《金剛石、石墨和C60》第一課時(shí)名師課件
- 醫(yī)療設(shè)備維保服務(wù)售后服務(wù)方案
- 建筑垃圾清運(yùn)服務(wù)投標(biāo)方案技術(shù)標(biāo)
- 學(xué)校食品安全課件(最終版)
- 人工橈骨頭置換手術(shù)
評(píng)論
0/150
提交評(píng)論