版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、-PAGE . z. - - s-計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)課題名稱 FTP客戶機(jī)搭建 學(xué)院 信息工程學(xué)院 專業(yè) 網(wǎng)絡(luò)工程 班級(jí) * * 目錄和索引一、需求分析21、功能需求2、開發(fā)環(huán)境與工具3、所需要知識(shí)二、知識(shí)理解 21、FTP實(shí)現(xiàn)的根本原理1概要2上傳和下載3用戶FTP和匿名FTP4ASCII和Binary(5)Port和Passive三、完成進(jìn)度3 1、已完成局部2、未完成局部3、還需改善的局部四、FTP效勞工作過程4五、詳細(xì)設(shè)計(jì)51、CFtpDlg類的一些函數(shù)定義52、CFtpOperate的一些函數(shù)定義17六、測(cè)試結(jié)果29七、用戶手冊(cè)32八、實(shí)驗(yàn)總結(jié)32FTP客戶端程序一、需求分析 1、功
2、能需求1實(shí)現(xiàn)一個(gè)圖形用戶界面的FTP客戶端,保證文件的平安傳輸和存儲(chǔ)。2提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面。3通過輸入效勞器地址、用戶名和密碼,可以實(shí)現(xiàn)遠(yuǎn)程FTP主機(jī)的登錄。4提供本地文件和文件夾的上傳功能,可對(duì)FTP主機(jī)文件進(jìn)展下載和刪除文件。5提供對(duì)本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄效勞器前可以作為一個(gè)簡(jiǎn)單的文件查詢工具對(duì)本地文件進(jìn)展查詢。6幫助頁面可以對(duì)用戶提供使用說明。7關(guān)于界面包含設(shè)計(jì)者的信息。9要求開發(fā)出的FTP客戶端符合標(biāo)準(zhǔn)FTP協(xié)議規(guī)*,支持ASCII傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式10FTP的兩種工作模式的選擇Port模式主動(dòng)和Passive模式
3、被動(dòng)2、開發(fā)環(huán)境與工具(1)使用的IDE:使用VC+6.0作為開發(fā)環(huán)境IDE(2)使用的語言:C+3使用的開發(fā)包:使用MFC和WinInet4開發(fā)平臺(tái):Windows 73、所需要知識(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熟悉控件的操作,如在List Ctrol添加圖片瀏覽文件或文夾的圖標(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)行
4、Uni*的效勞器,也有運(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ī)/效勞器系統(tǒng)。用戶通過一個(gè)支持FTP協(xié)議的客戶機(jī)程序,連接到在遠(yuǎn)程主機(jī)上的FTP效勞器程序。用戶通過客戶機(jī)程序向效勞器程序發(fā)出命令,效勞器程序執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結(jié)果返回到客戶機(jī)。使用FTP時(shí)必須首先登錄,在遠(yuǎn)程主機(jī)上獲得相應(yīng)的權(quán)限以后,方可下載或上傳文件。2上傳和下載下
5、載文件就是從遠(yuǎn)程主機(jī)拷貝文件至自己的計(jì)算機(jī)上;上傳文件就是將文件從自己的計(jì)算機(jī)中拷貝至遠(yuǎn)程主機(jī)上3用戶FTP和匿名FTP用戶FTP: 種方式為已在FTP效勞器上建立了特定*的用戶使用,需要合法的用戶名和密碼才能登錄到遠(yuǎn)程計(jì)算機(jī)傳輸文件。 匿名FTP:用戶作為“anonymous 登錄到FTP效勞器,不需要有自己的用戶名和密碼。4ASCII和BinaryASCII:文本傳輸器使用ASCII字符,并由回車鍵和換行符分開Binary:二進(jìn)制不用轉(zhuǎn)換或格式化就可傳字符,二進(jìn)制模式比文本模式更快,并且可以傳輸所有ASCII值,所以系統(tǒng)管理員一般將FTP設(shè)置成二進(jìn)制模式。 (5)Port和PassiveP
6、ort模式( 主動(dòng)):FTP 客戶端首先和FTP效勞器的TCP 21端口建立連接,通過這個(gè)通道發(fā)送命令,客戶端需要接收數(shù)據(jù)的時(shí)候在這個(gè)通道上發(fā)送PORT命令。 PORT命令包含了客戶端用什么端口接收數(shù)據(jù)。在傳送數(shù)據(jù)的時(shí)候,效勞器端通過自己的TCP 20端口連接至客戶端的指定端口發(fā)送數(shù)據(jù)。 FTP server必須和客戶端建立一個(gè)新的連接用來傳送數(shù)據(jù)。Passive模式被動(dòng):Passive模式在建立控制通道的時(shí)候和Standard模式類似,但建立連接后發(fā)送的不是Port命令,而是Pasv命令。FTP效勞器收到Pasv命令后,隨機(jī)翻開一個(gè)高端端口端口號(hào)大于1024并且通知客戶端在這個(gè)端口上傳送數(shù)據(jù)
7、的請(qǐng)求,客戶端連接FTP效勞器此端口,然后FTP效勞器將通過這個(gè)端口進(jìn)展數(shù)據(jù)的傳送,這個(gè)時(shí)候FTP server不再需要建立一個(gè)新的和客戶端之間的連接。三、完成進(jìn)度1、已完成局部1實(shí)現(xiàn)一個(gè)圖形用戶界面的FTP客戶端,保證文件的平安傳輸和存儲(chǔ)。2提供登錄界面,上傳下載界面、幫助界面、關(guān)于界面3通過輸入效勞器地址、用戶名和密碼,可以實(shí)現(xiàn)遠(yuǎn)程FTP主機(jī)的登錄。4提供本地文件上傳功能,可對(duì)FTP主機(jī)文件進(jìn)展下載和刪除文件。5提供對(duì)本地目錄的讀取與返回,能正確列出文件和文件夾,在沒有登錄效勞器前可以作為一個(gè)簡(jiǎn)單的文件查詢工具對(duì)本地文件進(jìn)展查詢。6幫助頁面可以對(duì)用戶提供使用說明。7關(guān)于界面包含設(shè)計(jì)者的信息
8、幫助界面和關(guān)于界面整合在一起。9支持ASCII傳輸模式和二進(jìn)制數(shù)據(jù)傳輸模式,外加自動(dòng)選擇的模式10FTP的兩種工作模式的選擇Port模式主動(dòng)和Passive模式被動(dòng)11提供用戶操作的狀態(tài)信息輸出2、未完成局部只提供了本地文件的上傳功能,暫時(shí)不能提供文件夾的上傳功能,由于當(dāng)初沒有使用多線程對(duì)效勞器端進(jìn)展操作,假設(shè)上傳或下載的文件過大,會(huì)導(dǎo)致界面陷入長(zhǎng)時(shí)間的不響應(yīng)中。由于時(shí)間問題,就不再進(jìn)展多線程的擴(kuò)大,也就不提供文件夾的上傳功能。3、還需改善的局部 1使用多線程進(jìn)展操作 2提供文件夾上傳和文件夾下載功能 3改良界面,提供更方便的操作 4增加上傳和下載的隊(duì)列 5同時(shí)可連接多個(gè)FTP效勞器 6改善提
9、示信息 7賬戶。密碼等用戶資料在本地加密后保存 8增加更多的功能,如下載完成后關(guān)機(jī)等 9等四、FTP效勞工作程五、詳細(xì)設(shè)計(jì) 1CFtpDlg類的一些函數(shù)定義BOOL CFtpDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBO* must be in the system mand range.ASSERT(IDM_ABOUTBO* & 0*FFF0) = IDM_ABOUTBO*);ASSERT(IDM_ABOUTBO* AppendMenu(MF_SEPARA
10、TOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBO*, strAboutMenu);SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);m_ctrBinary.SetCheck(1); m_ctrActive.SetCheck(1); m_editPort.SetWindowTe*t(21);bBinary1 = 1; / 使用二進(jìn)制 bPassive1 = 0; / 使用主動(dòng) myPort = 21;m_imgList.Create(20,20,ILC_COLOR32,0,0); / 創(chuàng)立圖像列表 m_im
11、gList.SetBkColor(RGB(255,255,255); / 文件夾圖標(biāo)hIconFold = :LoadIcon(Af*GetResourceHandle(),MAKEINTRESOURCE(IDI_FOLDER);/ 文件圖標(biāo)hIconFile = :LoadIcon(Af*GetResourceHandle(),MAKEINTRESOURCE(IDI_FILE); m_imgList.Add(hIconFold); m_imgList.Add(hIconFile); m_ctrlLocalFile.SetImageList(&m_imgList,LVSIL_SMALL); /
12、 關(guān)聯(lián) m_ctrlServerFile.SetImageList(&m_imgList,LVSIL_SMALL); / 關(guān)聯(lián)m_editServer.SetWindowTe*t(ftp:/);m_editName.SetWindowTe*t();m_editPassword.SetWindowTe*t();m_btnCon.EnableWindow(TRUE);m_btnClo.EnableWindow(FALSE);m_ctrlLocalFile.SetE*tendedStyle(LVS_E*_FULLROWSELECT|LVS_E*_GRIDLINES);m_ctrlServerFile
13、.SetE*tendedStyle(LVS_E*_FULLROWSELECT|LVS_E*_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_ctrlServerF
14、ile.InsertColumn(1,文件類型,LVCFMT_LEFT,100,1); m_ctrlServerFile.InsertColumn(2,修改日期,LVCFMT_LEFT,100,2);/ 添加硬盤盤符size_t szAllDriveStrings=:GetLogicalDriveStrings(0,NULL);TCHAR *pDriveStrings=new TCHARszAllDriveStrings+sizeof(_T( );GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);size_t szDriveStri
15、ng=:strlen(pDriveStrings);while(szDriveString0)m_ctrlLocal.AddString(pDriveStrings);pDriveStrings+=szDriveString+1;szDriveString=:strlen(pDriveStrings);int inde* = m_ctrlLocal.FindString(0,c:);m_ctrlLocal.SetCurSel(inde*);m_strLocPath = c:; / 初始化為c盤ListLocFile();cFtpOpr.setEidt(&m_ediMessage);return
16、 TRUE; / return TRUE unless you set the focus to a controlvoid CFtpDlg:OnSysmand(UINT nID, LPARAM lParam)if (nID & 0*FFF0) = IDM_ABOUTBO*)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysmand(nID, lParam);void CFtpDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device conte*t for paintingSend
17、Message(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int c*Icon = GetSystemMetrics(SM_C*ICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int * = (rect.Width() - c*Icon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(*, y, m_hIcon);elseCDialog:OnPaint();
18、HCURSOR CFtpDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;/ 連接效勞器void CFtpDlg:OnBtnConnect() / TODO: Add your control notification handler code here m_editServer.GetWindowTe*t(m_strServer); / 記錄FTP效勞器地址 CString strtemp;m_editPort.GetWindowTe*t(strtemp);myPort = :atoi(strtemp); / 獲得設(shè)置的端口號(hào)int i;if (bA
19、nony = 0)/ 不使用匿名m_editName.GetWindowTe*t(m_strName); / 記錄FTP登陸用戶名 m_editPassword.GetWindowTe*t(m_strPassword); / 記錄FTP登陸用戶密碼i = cFtpOpr.set(m_strServer,m_strName,m_strPassword);else/ 使用匿名CString strNameTemp;m_editName.GetWindowTe*t(strNameTemp); / 匿名登陸的用戶名i = cFtpOpr.set(m_strServer,strNameTemp,); i
20、f (i)/ 設(shè)置成功,翻開連接 if (cFtpOpr.OpenConnection()/ 連接成功m_btnClo.EnableWindow(TRUE);m_btnCon.EnableWindow(FALSE);UpdateServerFile();/ 更新效勞器的文件顯示m_ctrlServer.ResetContent();CString temp;cFtpOpr.GetPath(temp);m_ctrlServer.AddString(LPSTR)(LPCTSTR)temp); m_ctrlServer.SetCurSel(0);m_chkAnony.EnableWindow(FAL
21、SE);m_ctrActive.EnableWindow(FALSE);CButton *temp2 =(CButton*)GetDlgItem(IDC_PASSIVE);temp2-EnableWindow(FALSE);m_editPort.EnableWindow(FALSE); else/ 連接失敗void CFtpDlg:OnBtnClose() / 關(guān)閉連接if (cFtpOpr.CloseConnection()/ 關(guān)閉成功m_btnClo.EnableWindow(FALSE);m_btnCon.EnableWindow(TRUE);m_ctrlServerFile.Delet
22、eAllItems();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)void CFtpDlg:OnDblclkListLocalfile(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Ad
23、d your control notification handler code herePOSITION p=m_ctrlLocalFile.GetFirstSelectedItemPosition();if (p = NULL)return;/獲取剛選取的位置的下標(biāo)(從0開場(chǎng)的) int inde* = m_ctrlLocalFile.GetNe*tSelectedItem(p);/獲得選中的內(nèi)容/得到第inde*行.第0列的內(nèi)容(下標(biāo)從0開場(chǎng))CString FirstColumn=m_ctrlLocalFile.GetItemTe*t(inde*,0); CString SecondC
24、olumn = m_ctrlLocalFile.GetItemTe*t(inde*,1);if (inde* = 0) / 返回上層目錄 int k = m_strLocPath.GetLength() - 1;if (m_strLocPath.Right(2) = :)return;/ 刪除當(dāng)層的工程int i* = m_ctrlLocal.FindString(0,m_strLocPath);if (i* != CB_ERR)m_ctrlLocal.DeleteString(i*); for (int j = k -1; j = 2;-j) if (m_strLocPath.GetAt(j
25、) = )m_strLocPath = m_strLocPath.Left(j+1);break; ListLocFile(); *pResult = 0;return;if (SecondColumn=文件夾) CString strTemp = FirstColumn;m_strLocPath += strTemp + ; ListLocFile(); / 更新本地磁盤文件顯示else if (SecondColumn=文件) / 點(diǎn)到的是文件,進(jìn)展上傳if (cFtpOpr.ReStatus()=2)cFtpOpr.PutFtpFile(m_strLocPath + FirstColum
26、n,FirstColumn);UpdateServerFile();/ 更新效勞器的文件顯示*pResult = 0;void CFtpDlg:OnDblclkListServerfile(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code here/獲取選中的的一個(gè)位置POSITION p=m_ctrlServerFile.GetFirstSelectedItemPosition();if (p = NULL)return;/獲取剛選取的位置的下標(biāo)(從0開場(chǎng)的) int ind
27、e* = m_ctrlServerFile.GetNe*tSelectedItem(p);/獲得選中的內(nèi)容,得到第inde*行.第0列的內(nèi)容(下標(biāo)從0開場(chǎng))CString FirstColumn=m_ctrlServerFile.GetItemTe*t(inde*,0); CString SecondColumn = m_ctrlServerFile.GetItemTe*t(inde*,1);CStringArray ServName; int nFileNumber=0;if (inde* = 0) / 返回上層目錄 if (cFtpOpr.setBackPath() = 0) *pResu
28、lt = 0;return; UpdateServerFile();/ 更新效勞器的文件顯示CString temp;m_ctrlServer.ResetContent();cFtpOpr.GetPath(temp);m_ctrlServer.AddString(LPSTR)(LPCTSTR)temp); m_ctrlServer.SetCurSel(0); *pResult = 0;return;if (SecondColumn=文件夾) if (cFtpOpr.setNe*tPath(FirstColumn) = 0) *pResult = 0;return;UpdateServerFil
29、e();/ 更新效勞器的文件顯示CString temp;m_ctrlServer.ResetContent();cFtpOpr.GetPath(temp);m_ctrlServer.AddString(LPSTR)(LPCTSTR)temp); m_ctrlServer.SetCurSel(0);else if (SecondColumn=文件) / 點(diǎn)到的是文件,進(jìn)展下載cFtpOpr.GetFtpFile(FirstColumn,m_strLocPath);ListLocFile();*pResult = 0;/ 將本地文件列表出來void CFtpDlg:ListLocFile()m_
30、ctrlLocalFile.DeleteAllItems();int i* = m_ctrlLocal.FindString(0,m_strLocPath); if (i* = CB_ERR)int iy = m_ctrlLocal.GetCount(); m_ctrlLocal.SetCurSel(m_ctrlLocal.AddString(m_strLocPath); elsem_ctrlLocal.SetCurSel(m_ctrlLocal.SetCurSel(i*);int k = 0;m_ctrlLocalFile.InsertItem(0,.上層目錄); char * lpPath
31、 = (LPSTR)(LPCTSTR)m_strLocPath; char szFind300; WIN32_FIND_DATA FindFileData; strcpy(szFind,lpPath); strcat(szFind,*.*); HANDLE hFind=:FindFirstFile(szFind,&FindFileData); while(TRUE) if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) CString str = FindFileData.cFileName;if (str != . & st
32、r != .)LVITEM lvitem;lvitem.mask = LVIF_IMAGE|LVIF_TE*T; lvitem.iItem = k+1; lvitem.pszTe*t = (LPSTR)(LPCTSTR)str; lvitem.iImage = 0; lvitem.iSubItem =0; m_ctrlLocalFile.InsertItem(&lvitem); m_ctrlLocalFile.SetItemTe*t(k+1,1,文件夾); +k; else / 文件LVITEM lvitem;lvitem.mask = LVIF_IMAGE|LVIF_TE*T; lvitem
33、.iItem = k+1; lvitem.pszTe*t = FindFileData.cFileName; lvitem.iImage = 1; lvitem.iSubItem = 0; m_ctrlLocalFile.InsertItem(&lvitem); m_ctrlLocalFile.SetItemTe*t(k+1,1,文件); +k; if(!FindNe*tFile(hFind,&FindFileData)break; FindClose(hFind);/ 選擇了本地文件的組合框中的不同工程void CFtpDlg:OnSelchangebobo*e*Local() m_ctrl
34、Local.SetCurSel(m_ctrlLocal.GetCurSel();m_ctrlLocal.GetWindowTe*t(m_strLocPath); m_ctrlLocal.ResetContent();/ 添加硬盤盤符size_t szAllDriveStrings=:GetLogicalDriveStrings(0,NULL);TCHAR *pDriveStrings=new TCHARszAllDriveStrings+sizeof(_T( );GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);size_t szD
35、riveString=:strlen(pDriveStrings);while(szDriveString0)m_ctrlLocal.AddString(pDriveStrings);pDriveStrings+=szDriveString+1;szDriveString=:strlen(pDriveStrings);ListLocFile();/ 點(diǎn)擊了ASCII單項(xiàng)選擇按鈕void CFtpDlg:OnAscii() bBinary1 = 0; / 點(diǎn)擊了二進(jìn)制單項(xiàng)選擇按鈕void CFtpDlg:OnBinary() bBinary1 = 1; / 使用二進(jìn)制/ 自動(dòng)選擇二進(jìn)制或ASCI
36、I單項(xiàng)選擇按鈕void CFtpDlg:OnAuto() bBinary1 = 2; / 自動(dòng)/ 主動(dòng)方式單項(xiàng)選擇按鈕void CFtpDlg:OnActive() bPassive1 = 0;/ 被動(dòng)方式單項(xiàng)選擇按鈕void CFtpDlg:OnPassive() bPassive1 = 1;/ 上傳void CFtpDlg:OnBtnup() POSITION p=m_ctrlLocalFile.GetFirstSelectedItemPosition();if (p = NULL)return;/獲取剛選取的位置的下標(biāo)(從0開場(chǎng)的) int inde* = m_ctrlLocalFile
37、.GetNe*tSelectedItem(p);/獲得選中的內(nèi)容/得到第inde*行.第0列的內(nèi)容(下標(biāo)從0開場(chǎng))CString FirstColumn=m_ctrlLocalFile.GetItemTe*t(inde*,0); CString SecondColumn = m_ctrlLocalFile.GetItemTe*t(inde*,1);if (SecondColumn=文件夾) CTime CurrentTime=CTime:GetCurrentTime(); CString strTime;strTime.Format(%d/%d/%d %d:%d:%d ,CurrentTime
38、.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(), CurrentTime.GetMinute(),CurrentTime.GetSecond(); strTime += 暫不支持上傳文件夾!rn;int nLength = m_ediMessage.SendMessage(WM_GETTE*TLENGTH); m_ediMessage.SetSel(nLength, nLength); m_ediMessage.ReplaceSel(strTime); return;else if (Se
39、condColumn=文件) / 點(diǎn)到的是文件,進(jìn)展上傳if (cFtpOpr.ReStatus()=2)cFtpOpr.PutFtpFile(m_strLocPath + FirstColumn,FirstColumn); UpdateServerFile();/ 更新效勞器的文件顯示/下載void CFtpDlg:OnBtndown() / TODO: Add your control notification handler code herePOSITION p=m_ctrlServerFile.GetFirstSelectedItemPosition();if (p = NULL)r
40、eturn;/獲取剛選取的位置的下標(biāo)(從0開場(chǎng)的) int inde* = m_ctrlServerFile.GetNe*tSelectedItem(p);/獲得選中的內(nèi)容/得到第inde*行.第0列的內(nèi)容(下標(biāo)從0開場(chǎng))CString FirstColumn=m_ctrlServerFile.GetItemTe*t(inde*,0); CString SecondColumn = m_ctrlServerFile.GetItemTe*t(inde*,1);if (SecondColumn=文件夾) CTime CurrentTime=CTime:GetCurrentTime(); CStri
41、ng strTime;strTime.Format(%d/%d/%d %d:%d:%d ,CurrentTime.GetYear(),CurrentTime.GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(), CurrentTime.GetMinute(),CurrentTime.GetSecond(); strTime += 暫不支持下載文件夾!rn;int nLength = m_ediMessage.SendMessage(WM_GETTE*TLENGTH); m_ediMessage.SetSel(nLength, nLengt
42、h); m_ediMessage.ReplaceSel(strTime); return;else if (SecondColumn=文件) / 點(diǎn)到的是文件,進(jìn)展下載if (cFtpOpr.ReStatus()=2)/ 點(diǎn)到的是文件,進(jìn)展下載cFtpOpr.GetFtpFile(FirstColumn,m_strLocPath);ListLocFile(); / 下載完成后更新本地文件顯示/ 刪除效勞器文件或文件夾void CFtpDlg:OnBtndel() POSITION p=m_ctrlServerFile.GetFirstSelectedItemPosition();if (p =
43、 NULL)return;/獲取剛選取的位置的下標(biāo)(從0開場(chǎng)的) int inde* = m_ctrlServerFile.GetNe*tSelectedItem(p);/獲得選中的內(nèi)容/得到第inde*行.第0列的內(nèi)容(下標(biāo)從0開場(chǎng))CString FirstColumn=m_ctrlServerFile.GetItemTe*t(inde*,0); CString SecondColumn = m_ctrlServerFile.GetItemTe*t(inde*,1);if (SecondColumn=文件夾) if (cFtpOpr.ReStatus()=2)/ 移除文件夾cFtpOpr.
44、DeleteFTPf(FirstColumn,0); UpdateServerFile();/ 更新效勞器的文件顯示return;else if (SecondColumn=文件) if (cFtpOpr.ReStatus()=2)/ 移除文件cFtpOpr.DeleteFTPf(FirstColumn,1);UpdateServerFile();/ 更新效勞器的文件顯示void CFtpDlg:UpdateServerFile()/ 更新效勞器的文件顯示/ 獲得目錄CStringArray localName;int nFileNumber=0;nFileNumber=cFtpOpr.Get
45、MultipleFileName(&localName); m_ctrlServerFile.DeleteAllItems();m_ctrlServerFile.InsertItem(0,.上層目錄); for(int test=0;testnFileNumber;test+) CString stTemp = localName.GetAt(test); if (stTemp.Right(5) = )/ 文件夾LVITEM lvitem;CString str = stTemp.Left(stTemp.GetLength() - 5);lvitem.mask = LVIF_IMAGE|LVI
46、F_TE*T;lvitem.iItem =test+1; lvitem.pszTe*t = (LPSTR)(LPCTSTR)str; lvitem.iImage = 0; lvitem.iSubItem =0; m_ctrlServerFile.InsertItem(&lvitem); m_ctrlServerFile.SetItemTe*t(test+1,1,文件夾);else/ 文件LVITEM lvitem;lvitem.mask = LVIF_IMAGE|LVIF_TE*T; lvitem.iItem =test+1; lvitem.pszTe*t = (LPSTR)(LPCTSTR)
47、stTemp; lvitem.iImage = 1; lvitem.iSubItem =0; m_ctrlServerFile.InsertItem(&lvitem); m_ctrlServerFile.SetItemTe*t(test+1,1,文件); void CFtpDlg:OnBtnhelp() CAboutDlg dlg;dlg.DoModal();/ 用于屏蔽按下回車鍵程序退出的問題BOOL CFtpDlg:PreTranslateMessage(MSG* pMsg) if( pMsg-message =WM_KEYDOWN & pMsg-wParam=VK_RETURN )ret
48、urn true;return CDialog:PreTranslateMessage(pMsg);/ 復(fù)選框,是否匿名void CFtpDlg:OnChkanonymous() if (m_chkAnony.GetCheck()/ 被選上bAnony = 1; / 使用匿名m_editName.GetWindowTe*t(m_strName); / 記錄FTP登陸用戶名,用于不使用匿名后恢復(fù) m_editPassword.GetWindowTe*t(m_strPassword); / 記錄FTP登陸用戶密碼,用于不使用匿名后恢復(fù) m_editName.SetWindowTe*t(anonym
49、ous);m_editPassword.SetWindowTe*t();m_editName.EnableWindow(FALSE);m_editPassword.EnableWindow(FALSE);elsebAnony = 0; / 不使用匿名m_editName.SetWindowTe*t(m_strName); / 恢復(fù) m_editPassword.SetWindowTe*t(m_strPassword); / 恢復(fù)m_editName.EnableWindow(TRUE);m_editPassword.EnableWindow(TRUE);2CFtpOperate的一些函數(shù)定義/
50、 構(gòu)造函數(shù)CFtpOperate:CFtpOperate()strAppName.LoadString(AF*_IDS_APP_TITLE); / 獲得應(yīng)用程序的名字pInternetSession = new CInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG); pEdiMes = NULL;if(!pInternetSession)Af*MessageBo*(初始化會(huì)話失敗!);flag = -1; / 初始化失敗設(shè)為-1return;flag =0; / 初始化成功,標(biāo)志初始化為0 / 析構(gòu)函數(shù)CFtpOperate:CFt
51、pOperate()pInternetSession-Close();if(pInternetSession != NULL)delete pInternetSession;/ 設(shè)置,由外部調(diào)用,把數(shù)據(jù)傳進(jìn)來bool CFtpOperate:set(CString FullURL,CString UserName,CString Password)if (flag = -1) / 類實(shí)例初始化時(shí)失敗/ 重新設(shè)定 strAppName.LoadString(AF*_IDS_APP_TITLE); / 獲得應(yīng)用程序的名字pInternetSession = new CInternetSession
52、(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);if(!pInternetSession)Af*MessageBo*(初始化會(huì)話失敗!);flag = -1; / 初始化失敗設(shè)為-1return 0;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; elseif (m_
53、strFullURL.Left(6) != ftp:/)m_strFullURL = ftp:/ + m_strFullURL;flag = 1;return 1; return 0;/ 翻開連接bool CFtpOperate:OpenConnection()if (flag =2)/ 已連接了,先斷開CloseConnection();flag = 1;if (flag != 1)Af*MessageBo*(未成功進(jìn)展set調(diào)用);return 0;CWaitCursor cursor; CString strTemp;strTemp = ftp:/;/ 解析URLif (!Af*Pars
54、eURL(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效勞器 +
55、 m_strFullURL +rn;int nLength = pEdiMes-SendMessage(WM_GETTE*TLENGTH); pEdiMes-SetSel(nLength, nLength); pEdiMes-ReplaceSel(strTime); flag = 0;return 0;/提取pathint nInde*=strTemp.GetLength()+m_strServerName.GetLength();m_strFullPath=m_strFullURL.Right(m_strFullURL.GetLength()-nInde*); / 設(shè)置效勞器當(dāng)前路徑名m_s
56、trFullPath += /;/ 解析成功后進(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效勞器 + m_strServerName + rn;nLength = pEdiM
57、es-SendMessage(WM_GETTE*TLENGTH); pEdiMes-SetSel(nLength, nLength); pEdiMes-ReplaceSel(strTime); / 中選擇匿名的時(shí)候,m_strUserName為anonymous,m_strPassword/ 不使用匿名時(shí)為用戶輸入的用戶名和密碼if (bPassive1 =1) / 使用被動(dòng)方式pFtpConnection = pInternetSession-GetFtpConnection(m_strServerName,m_strUserName,m_strPassword, myPort,TRUE);
58、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.Get
59、Hour(), CurrentTime.GetMinute(),CurrentTime.GetSecond();strTime += 連接失敗rn;nLength = pEdiMes-SendMessage(WM_GETTE*TLENGTH); pEdiMes-SetSel(nLength, nLength); pEdiMes-ReplaceSel(strTime); return 0; CurrentTime=CTime:GetCurrentTime(); strTime.Format(%d/%d/%d %d:%d:%d ,CurrentTime.GetYear(),CurrentTime.
60、GetMonth(),CurrentTime.GetDay(),CurrentTime.GetHour(), CurrentTime.GetMinute(), CurrentTime.GetSecond(); strTime += 成功連接FTP效勞器 + m_strServerName + rn 當(dāng)前目錄為: + m_strFullPath + rn;nLength = pEdiMes-SendMessage(WM_GETTE*TLENGTH); pEdiMes-SetSel(nLength, nLength); pEdiMes-ReplaceSel(strTime); flag = 2;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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-2025學(xué)年高中語文 第三單元 古代議論性散文 第11課 師說說課稿 新人教版必修3
- 二零二五年度企業(yè)融資擔(dān)保合同范本
- 二零二五年度互聯(lián)網(wǎng)醫(yī)療合伙人股權(quán)分配及患者隱私保護(hù)協(xié)議
- 膠合板熱熔膠項(xiàng)目融資渠道探索
- 2023-2024學(xué)年滬科版(2019)高中信息技術(shù)必修一第二單元項(xiàng)目四《 認(rèn)識(shí)智能停車場(chǎng)中的數(shù)據(jù)處理-體驗(yàn)數(shù)據(jù)處理的方法和工具》說課稿001
- 5 《人應(yīng)當(dāng)堅(jiān)持正義》說課稿 2024-2025學(xué)年統(tǒng)編版高中語文選擇性必修中冊(cè)
- 2024-2025學(xué)年八年級(jí)物理上冊(cè) 2.4能量說課稿 (新版)教科版
- 2024-2025學(xué)年高中語文 唐宋詩 3 單元考點(diǎn)對(duì)接說課稿 語文版選修《唐宋詩詞鑒賞》
- 12古詩三首《示兒》說課稿-2024-2025學(xué)年五年級(jí)語文上冊(cè)統(tǒng)編版
- 2025至2030年無框大蝴蝶鎖項(xiàng)目投資價(jià)值分析報(bào)告
- 《新能源汽車技術(shù)》課件-第二章 動(dòng)力電池
- 數(shù)字金融 遠(yuǎn)程音視頻手機(jī)銀行技術(shù)規(guī)范
- 2024屆高考語文一輪復(fù)習(xí):論證思路專練(含答案)
- 四年級(jí)學(xué)業(yè)指導(dǎo)模板
- 2024版醫(yī)院布草洗滌承包合同:醫(yī)療設(shè)施布草清洗外包協(xié)議3篇
- 會(huì)議系統(tǒng)設(shè)備維護(hù)方案
- 少兒口才培訓(xùn)主持課件
- 新《學(xué)前教育法》知識(shí)講座課件
- 公文寫作題庫(500道)
- 學(xué)校教學(xué)常規(guī)管理學(xué)習(xí)活動(dòng)課件
- 2024-2030年中國(guó)大閘蟹養(yǎng)殖行業(yè)運(yùn)營(yíng)形勢(shì)分析及未來銷售格局研究報(bào)告
評(píng)論
0/150
提交評(píng)論