版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《計算機(jī)網(wǎng)絡(luò)》課程設(shè)計課題名稱 FTP客戶機(jī)搭建學(xué)院信息工程學(xué)院 專業(yè)網(wǎng)絡(luò)工程 班級 學(xué)號姓名第第#頁目錄和索引一、 需求分析 21、 功能需求2、 開發(fā)環(huán)境與工具3、 所需要知識二、 知識理解 21、FTP實現(xiàn)的基本原理(1)概要(2)上傳和下載(3)用戶FTP和匿名FTP(4)ASCH和BinaryPort和Passive三、完成進(jìn)度 31 、已完成部分2、 未完成部分3、 還需改善的部分四、FTP四、FTP服務(wù)工作過程 4TOC\o"1-5"\h\z\o"CurrentDocument"五、 詳細(xì)設(shè)計 51、 CFtpDlg類的一些函數(shù)定義 52、 CFtpOperate的一些函數(shù)定義 17\o"CurrentDocument"六、 測試結(jié)果 29七、用戶手冊 32八、實驗總結(jié) 32FTP客戶端程序一、 需求分析1、功能需求(1) 實現(xiàn)一個圖形用戶界面的FTP客戶端,保證文件的安全傳輸和存儲。(2) 提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面。(3) 通過輸入服務(wù)器地址、用戶名和密碼,可以實現(xiàn)遠(yuǎn)程FTP主機(jī)的登錄。(4) 提供本地文件和文件夾的上傳功能,可對FTP主機(jī)文件進(jìn)行下載和刪除文件。(5) 提供對本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄服務(wù)器前可以作為一個簡單的文件查詢工具對本地文件進(jìn)行查詢。(6) 幫助頁面可以對用戶提供使用說明。(7) 關(guān)于界面包含設(shè)計者的信息。(9) 要求開發(fā)出的FTP客戶端符合標(biāo)準(zhǔn)FTP協(xié)議規(guī)范,支持ASCH傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式(10) FTP的兩種工作模式的選擇Port模式(主動)和Passive模式(被動)2、 開發(fā)環(huán)境與工具(1)使用的IDE:使用VC++6.0作為開發(fā)環(huán)境IDE(2) 使用的語言:C++(3) 使用的開發(fā)包:使用MFC和Winlnet(4) 開發(fā)平臺:Windows73、 所需要知識(1) 計算機(jī)網(wǎng)絡(luò)的基本知識(2) 了解FTP基本實現(xiàn)原理(2) 使用VC++6.0EDE進(jìn)行MFC程序開發(fā)的基本知識(3) 熟悉Winlnet中屬于FTP部分的操作(4) 熟悉文件或文件夾操作(5)熟悉控件的操作,如在ListCtrol 添加圖片(瀏覽文件或文夾的圖標(biāo))二、 知識理解1、FTP實現(xiàn)的基本原理(1)概要Internet是一個非常復(fù)雜的計算機(jī)環(huán)境, Internet上的計算機(jī)已有上千萬臺, 而這些計算機(jī)可能運行不同的操作系統(tǒng),有運行Unix的服務(wù)器,也有運行Dos、Windows的PC機(jī)等等,而各種操作系統(tǒng)之間的文件交流問題, 需要建立一個統(tǒng)一的文件傳輸協(xié)議, 這就是所謂的FTP。基于不同的操作系統(tǒng)有不同的FTP應(yīng)用程序,而所有這些應(yīng)用程序都遵守同一種協(xié)議,這樣用戶就可以把自己的文件傳送給別人,或者從其它的用戶環(huán)境屮獲得文件。FTP也是一個客戶機(jī)/服務(wù)器系統(tǒng)。用戶通過一個支持 FTP協(xié)議的客戶機(jī)程序,連接到在遠(yuǎn)程主機(jī)上的FTP服務(wù)器程序。用戶通過客戶機(jī)程序向服務(wù)器程序發(fā)出命令, 服務(wù)器程序執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結(jié)果返回到客戶機(jī)。使用FTP時必須首先登錄,在遠(yuǎn)程主機(jī)上獲得相應(yīng)的權(quán)限以后,方可下載或上傳文件。(2)上傳和下載”下載”文件就是從遠(yuǎn)程主機(jī)拷貝文件至自己的計算機(jī)上;
”上傳”文件就是將文件從自己的計算機(jī)屮拷貝至遠(yuǎn)程主機(jī)上(3) 用戶FTP和匿名FTP用戶FTP:種方式為已在FTP服務(wù)器上建立了特定帳號的用戶使用,需要合法的用戶名和密碼才能登錄到遠(yuǎn)程計算機(jī)傳輸文件。匿名FTP:用戶作為"anonymous"登錄到FTP服務(wù)器,不需要有自己的用戶名和密碼。(4) ASCnWBinaryAscn:文本傳輸器使用ascd字符,并由回車鍵和換行符分開Binary:二進(jìn)制不用轉(zhuǎn)換或格式化就可傳字符, 二進(jìn)制模式比文本模式更快,并且可以傳輸所有ASCH值,所以系統(tǒng)管理員一般將 FTP設(shè)置成二進(jìn)制模式。(5)Port和PassivePort模式(主動):FTP客戶端首先和FTP服務(wù)器的TCP21端口建立連接,通過這個通道發(fā)送命令,客戶端需要接收數(shù)據(jù)的時候在這個通道上發(fā)送PORT命令。PORT命令包含了客戶端用什么端口接收數(shù)據(jù)。在傳送數(shù)據(jù)的時候,服務(wù)器端通過自己的 TCP20端口連接至客戶端的指定端口發(fā)送數(shù)據(jù)。FTPserver必須和客戶端建立一個新的連接用來傳送數(shù)據(jù)。Passive模式(被動):Passive模式在建立控制通道的時候和 Standard模式類似,但建立連接后發(fā)送的不是Port命令,而是Pasv命令。FTP服務(wù)器收到Pasv命令后,隨機(jī)打開一個高端端口(端口號大于1024)并且通知客戶端在這個端口上傳送數(shù)據(jù)的請求,客戶端連接 FTP服務(wù)器此端口,然后FTP服務(wù)器將通過這個端口進(jìn)行數(shù)據(jù)的傳送,這個時候FTPserver不再需要建立一個新的和客戶端之間的連接。三、完成進(jìn)度1、 已完成部分(1) 實現(xiàn)一個圖形用戶界面的FTP客戶端,保證文件的安全傳輸和存儲。(2) 提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面(3)通過輸入服務(wù)器地址、用戶名和密碼,可以實現(xiàn)遠(yuǎn)程 FTP主機(jī)的登錄。(4) 提供本地文件上傳功能,可對FTP主機(jī)文件進(jìn)行下載和刪除文件。(5) 提供對本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄服務(wù)器前可以作為一個簡單的文件查詢工具對本地文件進(jìn)行查詢。(6) 幫助頁面可以對用戶提供使用說明。(7)關(guān)于界面包含設(shè)計者的信息(幫助界面和關(guān)于界面整合在一起) 。(9) 支持ASCH傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式,外加自動選擇的模式(10) FTP的兩種工作模式的選擇Port模式(主動)和Passive模式(被動)(11) 提供用戶操作的狀態(tài)信息輸出2、 未完成部分只提供了本地文件的上傳功能,暫時不能提供文件夾的上傳功能,由于當(dāng)初沒有使用多線程對服務(wù)器端進(jìn)行操作,若上傳或下載的文件過大,會導(dǎo)致界面陷入長時間的不響應(yīng)中。由于時間問題,就不再進(jìn)行多線程的擴(kuò)充,也就不提供文件夾的上傳功能。3、 還需改善的部分(1)使用多線程進(jìn)行操作(2)提供文件夾上傳和文件夾下載功能(3)改進(jìn)界面,提供更方便的操作(4)增加上傳和下載的隊列(5)同時可連接多個FTP服務(wù)器改善提示信息(7)賬戶。密碼等用戶資料在本地加密后保存(8)增加更多的功能,如下載完成后關(guān)機(jī)等(9)等 四、FTP服務(wù)工作程五、詳細(xì)設(shè)計(1)CFtpDig類的一些函數(shù)定義BOOLCFtpDlg::OnInitDialog(){CDialog::OnInitDialog();//Add"About...”menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&OxFFFO)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<OxFOOO);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL)
CStringstrAboutMenu;strAboutMenu.Loadstring(EDS_ABOUTBOX);if(!strAboutMenu.IsEmptyO){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRD4G,EDM_ABOUTBOX,strAboutMenu);}}Setlcon(m_hlcon,TRUE);Setlcon(m_hlcon,FALSE);m_ctrBinary.SetCheck(l);m_ctrActive.SetCheck(1);m_editPort.SetWindowText("21”);bBinaryl=1;//使用二進(jìn)制bPassive1=0;// 使用主動myPort=21;m_imgList.Create(20,20,ILC_COLOR32,0,0);// 創(chuàng)建圖像列表m_imgList.SetBkColor(RGB(255,255,255));// 文件夾圖標(biāo)hlconFold=::LoadIcon(AixGetResourceHandle(),MAKEINTRESOURCE(IDI_FOLDER));//文件圖標(biāo)hlconFile=::LoadIcon(AlxGetResourceHandle(),MAKEINTRESOURCE(IDI_FILE));m_imgList.Add(hIconFold);m_imgList.Add(hIconFile);m_ctrlLocaIFile.SetimageList(&m_imgList,LVSIL_SMALL);// 關(guān)聯(lián)m_ctrlServerFile.SetlmageLis gLisf,LVSIL_SMALL);// 關(guān)聯(lián)m_editServer.SetWindowText(nftp://H);m_editName.SetWindowText(,,u);m_editPassword.SetWindowText('M,);m_btnCon.EnableWindow(TRUE);m_btnClo.EnableWindow(FALSE);m_ctrlLocalFile.SetExtendedStyle(LVS_EX_FULLROWSELECTILVS_EX_GRIDLINES);m_ctrlServerFOe.SetExtendedStyle(LVS_EX_FULLROWSELECTILVS_EX_GRIDLINES)m_ctrlLocalFile.InsertColumn(0,nm_ctrlLocalFile.InsertColumn(l,nm_ctrlLocalFile.InsertColumn(2,nm_ctrlServerFile.InsertColumn(0,m_ctrlLocalFile.InsertColumn(0,nm_ctrlLocalFile.InsertColumn(l,nm_ctrlLocalFile.InsertColumn(2,nm_ctrlServerFile.InsertColumn(0,nm_ctrlServerFile.InsertColumn(l,nm_ctrlServerFile.InsertColumn(2,u//添加硬盤盤符修改日期”,LVCFMT_LEFT,100,2);文件名”,LVCFMT_LEFT,140,0);//設(shè)置列文件類型”,LVCFMT_LEFT,100,1);修改日期”,LVCFMT_LEFT,100,2);size_tszAllDriveStrings=::GetLogicaIDriveStrings(0,NULL);TCHAR^Drivestrings=newTCHARIszAllDriveStrings+sizeofCTC1'H))];GetLogicaIDriveStrings(szAllDriveStrings,pDriveStrings);size_tszDriveString=::strien(pDriveStrings);while(szDriveString>0)m_ctrlLocal.AddString(pDriveStrings);pDriveStrings+=szDriveString+1;szDriveString=::strien(pDriveStrings);}intindex=m_ctrlLocal.FindString(0,nc:\\H);m_ctrlLocaLSetCurSel(index);m_strLocPath="c:\\";// 初始化為c盤ListLocFile();cFtpOpr.setEidt(&m_ediMessage);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCFtpDlg::OnSysCommand(UINTnID,LPARAMIParam){if((nID&OxFFFO)==IDM_ABOUTBOX){CAboutDlgdigAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,IParam);}}voidCFtpDlg::OnPaint(){if(Islconic()){CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);intcxlcon=GetsystemMetries(SM_CXICON);intcylcon=GetsystemMetries(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()?cxlcon+1)/2;inty=(rect.Height()-cylcon+1)/2;dc.DrawIcon(x,y,m_hlcon);}else{CDialog::OnPaint();HCURSORCFtpDlg::OnQueryDragIcon()return(HCURSOR)m_hlcon;}//連接服務(wù)器voidCFtpDlg::OnBtnConnect(){//TODO:Addyourcontrolnotificationhandlercodeherem_editServer.GetWindowText(m_strServer);// 記錄FTP服務(wù)器地址CStringstrtemp;m_editPort.GetWindowText(strtemp);myPort=::atoi(strtemp);// 獲得設(shè)置的端口號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,,n,);}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(O);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.DeleteAllltems();m_ctrlServer.ResetContent();m_ctrActive.EnableWindow(TRUE);CButton*temp2=(CButton*)GetDlgItem(IDC_PASSIVE);temp2->EnableWindow(TRUE);m_editPort.EnableWindow(TRUE);m_chkAnony.EnableWindow(TRUE);}}//雙擊本地文件列表控件屮的選項voidCFtpDlg::OnDblclkListLocaffile(NMHDR*pNMHDR,LRESULT*pResult){//TODO:AddyourcontrolnotificationhandlercodeherePOSITIONp=m_ctrlLocalFile.GetFirstSelectedItemPosition();if(p==NULL){return;}//獲取剛選取的位置的下標(biāo) (從0開始的)intindex=m_ctrlLocaIFile.GetNextSelectedItem(p);//獲得選屮的內(nèi)容//得到第index行?第0列的內(nèi)容(下標(biāo)從0開始)CStringFirstColumn=m_ctrlLocalFile.GetItemText(index,0);CStringSecondColumn=m_ctrlLocalFile.GetItemText(index,l);if(index==0)// 返回上層目錄{intk=m_strLocPath.GetLength()?1;if(m_strLocPath.Right(2)==”:\\”){return;}//刪除當(dāng)層的項目intix=m_ctrlLocaLFindString(09m_strLocPath);if(ix!=CB_ERR)m_ctrlLocal.DeleteString(ix);}for(intj=k-l;j>=2;-j){if(m_strLocPath.GetAt(j)==AV){m_strLocPath=m_strLocPath.Left(j+l);break;}}ListLocFile();巾Result=0;return;}if(SecondColumn==H文件夾u){CStringstrTemp=FirstColumn;m_strLocPath+=strTemp+'\\:ListLocFile();// 更新本地磁盤文件顯示}elseif(SecondColumn==u文件"){//點到的是文件,進(jìn)行上傳if(cFtpOpr.ReStatus()==2){cFtpOpr.PutFtpFile(m_strLocPath+FirstColumn,FirstColumn);UpdateServerFile();// 更新服務(wù)器的文件顯示}}*pResult=0;}voidCFtpDlg::OnDblclkListServerfile(NMHDR*pNMHDR,LRESULT*pResult){//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.GetltemText(index,1);CStringArrayServName;intnFileNumber=O;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(O);^Result=0;return;}if(SecondColumn==H文件夾u){if(cFtpOpr.setNextPath(FirstColumn)==0){^Result=0;return;)UpdateServerFile();// 更新服務(wù)器的文件顯示CStringtemp;m_ctrlServer.ResetContent();cFtpOpr.GetPath(temp);m_ctrlServer.AddString((LPSTR)(LPCTSTR)temp);m_ctrlServer.SetCurSel(O);}elseif(SecondColumn==u文件"){//點到的是文件,進(jìn)行下載cFtpOpr.GetFtpFile(FirstColumn,m_strLocPath);ListLocFile();}*pResult=0;//將本地文件列表出來voidCFtpDlg::ListLocFile()m_ctrlLocalFile.DeleteAllltems();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_ctrlLocaLSetCurSel(ix));}intk=0;m_ctrlLocalFile.InsertItem(0,n... 上層目錄”);char*IpPath=(LPSTR)(LPCTSTR)m_strLocPath;charszFind[300];WIN32_FIND_DATAFindFileData;strcpy(szFind,IpPath);strcat(szFind,HANDLEhFind=::FindFirstFile(szFind,&FindFileData);whUe(TRUE){if(FindFileData,dwFHeAttributes&FILE_ATTRIBUTE_DIRECTORY){CStringstr=FindFileData.cFileName;if(str!=7&&str{LVITEMlvitem;lvitem.mask=LVIF_IMAGEILVIF_TEXT;lvitem.iltem=k+1;lvitem.pszText=(LPSTR)(LPCTSTR)str;lvitem.ilmage=0;lvitem.iSubItem=0;m_ctrlLocalFile.InsertItem(&lvitem);m_ctrlLocalFile.SetltemText(k+1,1,”文件夾”);++k;else{//文件LVITEMlvitem;lvitem.mask=LVIF_IMAGEILVTF_TEXT;lvitem.iltem=k+1;lvitem.pszText=FindFileData.cFileName;lvitem.ilmage=1;lvitem.iSubltem=0;m_ctrlLocalFile.InsertItem(&lvitem);m_ctrlLocalFile.SetltemText(k+l,l," 文件“);++k;}if(!FindNextFile(hFind,&FindFileData))break;}FindClose(hFind);}//選擇了本地文件的組合框中的不同項目voidCFtpDlg::OnSelchangeComboboxexLocal(){m_ctrlLocaLSetCurSel(m_ctrlLocal.GetCurSe1());m_ctrlLocal.GetWindowText(m_strLocPath);m_ctrlLocal.ResetContent();//添加硬盤盤符size_tszAllDriveStrings=::GetLogicaIDriveStrings(O,NULL);TCHAR^Drivestrings=newTCHAR[szAllDriveStrings+sizeof(_T(,'H))];GetLogicaIDriveStrings(szAllDriveStrings,pDriveStrings);size_tszDriveString=::strien(pDriveStrings);while(szDriveString>0){m_ctrlLocal.AddString(pDriveStrings);pDriveStrings+=szDriveString+1;szDriveString=::strien(pDriveStrings);}ListLocFile();}//點擊了Ascn單選按鈕voidCFtpDlg::OnAscii(){bBinaryl=0;}//點擊了二進(jìn)制單選按鈕voidCFtpDlg::OnBinary(){bBinaryl=1;// 使用二進(jìn)制//自動選擇二進(jìn)制或ASCH單選按鈕voidCFtpDlg::OnAuto()bBinaryl=2;//自動}//主動方式單選按鈕voidCFtpDlg::OnActive(){bPassive1=0;}//被動方式單選按鈕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,l);if(SecondColumn==H文件夾”){CTimeCurrentTime=CTime::GetCurrentTime();CStringstrTime;strTime.Format(H%d/%d/%d%d:%d:%dn,CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),Curren(Time.GetMinute(),CuiTentTime.GetSecond());strTime+=” 暫不支持上傳文件夾!\r\n";intnLength=m_ediMessage.SendMessage(WM_GETTEXTLENGTH);m_ediMessage.SetSel(nLength,nLength);m_ediMessage.ReplaceSel(strTime);return;elseif(SecondColumn==H文件")//點到的是文件,進(jìn)行上傳if(cFtpOpr.ReStatus()==2){cFtpOpr.PutFtpFile(m_strLocPath+FirstColumn,FirstColumn);UpdateServerFile();// 更新服務(wù)器的文件顯示//下載voidCFtpDlg::OnBtndown(){//TODO:AddyourcontrolnotificationhandlercodeherePOSITIONp=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.GetltemText(index,0);CStringSecondColumn=m_ctrlServerFile.GetltemText(index,1);if(SecondColumn==H文件夾u){CTimeCurrentTime=CTime::GetCurrentTime();CStringstrTime;strTime.Format(H%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),Curren(Time.GetMinute(),CurrentTime.GetSecond());strTime+=” 暫不支持下載文件夾!\r\n”;intnLength=m_ediMessage.SendMessage(WM_GETTEXTLENGTH);m_ediMessage.SetSel(nLength,nLength);m_ediMessage.ReplaceSel(strTime);return;}elseif(SecondColumn==n 文件")//點到的是文件,進(jìn)行下載if(cFtpOpr.ReStatus()==2)//點到的是文件,進(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.GetltemText(index,0);CStringSecondColumn=m_ctrlServerFile.GetItemText(index,l);if(SecondColumn==H文件夾”){if(cFtpOpr.ReStatus()==2){//移除文件夾cFtpOpr.DeleteFTPf(FirstColumn,0);UpdateServerFile();// 更新服務(wù)器的文件顯示return;}elseif(SecondColumn==H文件"){if(cFtpOpr.ReStatus()==2){//移除文件cFtpOpr.DeleteFTPf(FirstColumn,l);UpdateServerFile();// 更新服務(wù)器的文件顯示voidCFtpDig::UpdateServerFile()// 更新服務(wù)器的文件顯示//獲得目錄CStringArraylocalName;intnFileNumber=O;nFileNumber=cFtpOpr.GetMultipleFileName(&localName);m_ctrlServerFile.DeleteAllltems();m_ctrlServerFile.InsertItem(O,H... 上層目錄”);fbr(inttest=O;test<nFileNumber;test++){CStringstTemp=localName.GetAt(test);if(stTemp.Right(5)==”vDIR>”){//文件夾LVITEMlvitem;CStringstr=stTemp.Left(stTemp.GetLength()?5);lvitem.mask=LVIF_D4AGEILVIF_TEXT;lvitem.iltem=test+l;lvitem.pszText=(LPSTR)(LPCTSTR)str;lvitem.ilmage=0;lvitem.iSubItem=0;m_ctrlServerFile.Insertltem(&lvitem);m_ctrlServerFile.SetltemText(test+l,l," 文件夾");)else{//文件LVITEMlvitem;lvitem.mask=LVIF_IMAGEILVIF_TEXT;lvitem.iltem=test+1;lvitem.pszText=(LPSTR)(LPCTSTR)stTemp;lvitem.ilmage=1;lvitem.iSubItem=0;m_ctrlServerFile.Insertltem(&lvitem);m_ctrlServerFile.SetltemText(test+1,1,'* 文件“);voidCFtpDlg::OnBtnhelp(){CAboutDlgdig;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);//用于不使用匿名后恢復(fù)m_editName.SetWindowText(nanonymousn);m_editPassword.SetWindowText(””);m_editName.EnableWindow(FALSE);m_editPassword.EnableWindow(FALSE);}else{bAnony=0;// 不使用匿名m_editName.SetWindowText(m_strName);//m_editPassword.SetWindowText(m_strPassword);//m_editName.EnableWindow(TRUE);m_editPassword.EnableWindow(TRUE);記錄FTP登陸用戶密碼,恢復(fù)恢復(fù)(2)CFtpOperate的一些函數(shù)定義//構(gòu)造函數(shù)CFtpOperate::CFtpOperate()strAppName.LoadString(AFX_IDS_APP_TrrLE);//獲得應(yīng)用程序的名字pInternetsession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);pEdiMes=NULL;if(!pIntemetSession)AfxMessageBox(H初始化會話失敗!");flag=-l;// 初始化失敗設(shè)為-1return;}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è)定strAppName.LoadString(AFX_IDS_APP_TITLE);// 獲得應(yīng)用程序的名字pinternetSession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);if(!pInternetSession){Al\MessageBox(n初始化會話失敗!");flag=-l;// 初始化失敗設(shè)為-1return0;}flag=0;}//flag不等于-1時才會進(jìn)行以下設(shè)置m_strUserName=UserName;//用戶名字m_strPassword=Password;//用戶密碼m_strFuUURL=FuUURL;// 設(shè)置路徑if(m_strFuUURL=="IIm_strUserName==””){flag=0;}else{if(m_strFuUURL.Left(6)!=凈p:〃”){m_strFuUURL=nftp://n+m_strFuUURL;}flag=1;return1;}return0;
//打開連接boolCFtpOperate::OpenConnection(){if(flag==2){//已連接了,先斷開CloseConnection();flag=1;}if(flag!=1){AlxMessageBox(H未成功進(jìn)行set調(diào)用”);return0;}CWaitCursorcursor;CStringstrTemp;strTemp=”ftp://”;//解析URLif(!AixParseURL(m_strFullURL,dwServiceType,m_strServerName,strAppName,nPort)){CurrentTime=CTime::GetCurrentTime();strTime.Format(H%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?>Se{Scl(nLength,nLength);pEdiMes->ReplaceSel(strTime);flag=0;return0;}//提取path設(shè)置intnIndex=strTemp.GetLength()+m_strServerName.GetLength();設(shè)置m_strFullPath=m_strFullURL.Right(m_strFullURL.GetLength()-nIndex);//服務(wù)器當(dāng)前路徑名m_strFullPath+=7‘;//解析成功后進(jìn)行連接try{CurrentTime=CTime::GetCurrentTime();strTime.Format("%d/%d/%d%d:%d:%dn,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)選擇匿名的時候, m_sh*UserNamc為anonymous,m_strPassword//不使用匿名時為用戶輸入的用戶名和密碼if(bPassive1==1){//使用被動方式pFtpConnection=pInternetSession->GetFtpConnection(m_strServerName,m_strUserName,m_strPassword,myPort,TRUE);)else{//使用主動方式pFtpConnection=pInternetSession->GetFtpConnection(m_strServerName,m_strUserName,m_strPassword,myPort,FALSE);)if(pFtpConnection==NULL){CurrentTime=CTime::GetCurrentTime();stiTime.Format(”%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+=”連接失敗\r\nH;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+H\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(CIntemetException*pEx){TCHARszErr[1024];pEx->GetErrorMessage(szErr,1024);TRACE(szErr);CurrentTime=CTime::GetCurrentTime();stiTimc.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=O;// 連接失敗return0;}return1;}//關(guān)閉連接boolCFtpOperate::CloseConnection(){if(pFtpConnection==NULL){return1;}try{pFtpConnection->Close();}catch(...){return0;}if(pFtpConnection!=NULL){deletepFtpConnection;}CurrentTime=CTime::GetCurrentTime();strTime.Format(n%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;//initsomevarBOOLgoodfile;intx=0;CurrentTime=CTime::GetCuiTentTime();strTime.Format(H%d/%d/%d%d:%d:%d*\CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+=” 下載文件,請稍候: ”+remote+” \r\n";nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes?>Se(Sel(nLength,nLength);pEdiMes->ReplaceSel(strTime);pFtpConnection->SetCurrentDirectory(m_strFullPath);if(bBinaryl==1){//二進(jìn)制方式goodfile=pFtpConnectio GetFile(m_strFullPath+'/'+remote,local+remote,FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY);}elseif(bBinaryl==0){//ASCH方式goodfile=pFtpConnectio GetFile(m_strFullPath+'/'+remote,local+remote,FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_ASCU);)elseif(bBinaryl==2){goodtile=pFtpConnectio GetFile(m_strFuIIPath+7'+remote,local+remote,FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_UNKNOWN);if(!goodfile){CurrentTime=CTime::GetCurrentTime();stiTime.Fonnat("%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),Curren(Time.GetMinute(),CurrentTime.GetSecond());strTime+=” 下載出錯,請重試\r\n”;nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime);return0;}else{CurrentTime=CTime::GetCurrentTime();strTime.Format(n%d/%d/%d%d:%d:%dCurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.Getsecond());strTime+="下載文件成功,保存于:”+local+remote+ArXn”;nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTiiiie);}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:%dn,CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+=” 上傳文件,請稍候:”+locals"\r\nn;nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSe1(strTime);if(bBinaryl==1){// 二進(jìn)制方式goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_BINARY);}else{if(bBinaryl==0){//ASCH方式goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_ASCH);}elseif(bBinaryl==2){//自動方式goodfile=pFtpConnection->PutFile(local,m_strFullPath+remote,FTP_TRANSFER_TYPE_UNKNOWN);if(!goodfile){CurrentTime=CTime::GetCurrentTime();strTime.Format(H%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(strTiiTie);return0;}else{CurrentTime=CTime::GetCurrentTime();strTime.Format(H%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonthO,CurrentTime.GetDayO,CurrentTime.GetHour(),Curren(Time.GetMinute(),CurrentTime.GetSecond());strTime+="文件:”+local+”上傳成功”+ 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+n*n);if(goodfile==FALSE){fFiles.Close();return0;CStringstr;while(goodfile)goodfile=fFiles.FindNextFile();str=fFiles.GetFileName();if(tFiles.IsDirectoryO)str+=n<DIR>n;}localNameArray->InsertAt(x,str);nFileNumber++;x++;}tFiles.Close();//returnthenumberofmissingfile,ifany.returnnFileNumber;}//設(shè)置服務(wù)器下一層文件目錄boolCFtpOperate::setNextPath(CStringstrPath){CStringtemp=m_strFullPath;inti=m_strFullPath.GetLength()-1;if(m_strFullPath.GetAt(i)!=7){m_strFullPath+=7';}m_strFullPath+=strPath+7:CurrentTime=CTime::GetCurrentTime();strTime.Format(H%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDayO,CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.Getsecond());strTime+=” 當(dāng)前目錄為:”+m_strFullPath+"\r\n";nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes?>ScfSel(nLength,nLength);pEdiMes->ReplaceSel(strTime);return1;}//返回上一層目錄boolCFtpOperate::setBackPath(){CStringstr;pFtpConnection->GetCurrentDirectoryAsURL(str);inti=m_strFullURL.GetLength()-1;intj=str.GetLength()?1;//AfxMessageBox(str);{m_strFullPath=str.Right(j-i);}if(m_strFullPath==7'){return0;}else{inti=m_sh*FullPath.GctLength()?2;//省略最后的一個’/'for(;i>=0;—i){if(m_strFuIIPath.GetAt(i)==7*){CStringtemp;temp=m_strFullPath.Lelt(i);m_strFullPath=temp;m_strFullPath+='/*;CurrentTime=CTime::GetCurrentTime();strTime.Format(H%d/%d/%d%d:%d:%d",CurrentTime.GetYear(),CurrentTinie.GetMonlh(),CurrentTime.GetDay(),CurrentTime.GetHour(),CurrentTime.GetMinute(),CurrentTime.GetSecond());strTime+=”當(dāng)前目錄為:“+m_strFuUPath+”\r\n”;nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes?>SctScl(nLeng{h,nLength);pEdiMes->ReplaceSel(strTime);return1;return1;}//用temp返回服務(wù)器的當(dāng)前路徑voidCFtpOperate::GetPath(CString&temp){temp=m_strFuIIPath;}//信息輸岀的控件句柄傳入voidCFtpOperate::setEidt(CEdit^EdiMessage){pEdiMes=pEdiMessage;//移除,index為0表示移除文件夾,否則為移除文件intCFtpOperate::DeleteFTPf(CStringremote,intindex){if(flag!=2){//連接未成功return0;}CWaitCursorcursor;//initsomevarBOOLgoodfile;intx=0;CurrentTime=CTime::GetCuiTentTime();strTime.Format("%d/%d/%d%d:%d:%dn,CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(),Curren(Time.GetMinute(),CurrentTime.GetSecond(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新課標(biāo)小學(xué)語文“學(xué)習(xí)任務(wù)群”的教學(xué)思路
- 高中物理第十一章電路及其應(yīng)用課時13串聯(lián)電路和并聯(lián)電路課件新人教版必修第三冊
- Windows Server網(wǎng)絡(luò)管理項目教程(Windows Server 2022)(微課版)5.5 拓展案例1:Web站點安全加固
- 全省小學(xué)數(shù)學(xué)教師賽課一等獎數(shù)學(xué)一年級上冊(人教2024年新編)《10的加、減法》課件
- 2014年腔體耦合器投資分析研究咨詢報告
- 2024至2030年中國整體式豆奶機(jī)行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國成套污水處理機(jī)械設(shè)備數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國家用縫紉機(jī)控制器拉桿行業(yè)投資前景及策略咨詢研究報告
- 高中物理第五章交變電流5電能的輸送課件新人教版選修3-
- 2024至2030年中國中頻整體退火設(shè)備行業(yè)投資前景及策略咨詢研究報告
- 國際會計教學(xué)大綱
- 可逆反擊錘式破碎機(jī)施工方案
- 同步器設(shè)計手冊
- 小(微)工貿(mào)企業(yè)安全生產(chǎn)基礎(chǔ)臺賬
- 發(fā)展心理學(xué)思維導(dǎo)圖
- 【中期小結(jié)】《初中語文課堂問題有效設(shè)計的研究》課題研究中期小結(jié)
- 診所執(zhí)業(yè)情況工作總結(jié)診所執(zhí)業(yè)期間業(yè)務(wù)開展情況.doc
- 內(nèi)外腳手架施工方案
- 八年級數(shù)學(xué)上冊 2.4《整式的除法》2 多項式除以單項式教案 華東師大版
- 網(wǎng)絡(luò)GIS考試試題
- 在街道計生協(xié)會換屆選舉暨三屆一次理事會議上的工作報告
評論
0/150
提交評論