FTP客户端课程设计报告书知识培训资料_第1页
FTP客户端课程设计报告书知识培训资料_第2页
FTP客户端课程设计报告书知识培训资料_第3页
FTP客户端课程设计报告书知识培训资料_第4页
FTP客户端课程设计报告书知识培训资料_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE第32页《计算机网络》课程设计课题名称课题名称FTP客户机搭建学院信息工程学院专业网络工程班级学号姓名目录和索引一、需求分析——--——----———-————-—-—-----—------21、功能需求2、开发环境与工具3、所需要知识二、知识理解--—---———-------—-——-------—-----—---—21、FTP实现的基本原理(1)概要(2)上传和下载(3)用户FTP和匿名FTP(4)ASCII和Binary(5)Port和Passive三、完成进度-—-—--—-----—-—--—-—-——--————--—-—----31、已完成部分2、未完成部分3、还需改善的部分四、FTP服务工作过程----—---—---—--—-—---—---—--4五、详细设计--—----———-—-—-——--——---—-51、CFtpDlg类的一些函数定义………………52、CFtpOperate的一些函数定义……………17六、测试结果--———-----—----—---—--——----—-—-—-—--29七、用户手册—-—-—-———--————----——--—-—-—-—---—32八、实验总结-———-———-—--—---—--—-—-————---32FTP客户端程序一、需求分析1、功能需求(1)实现一个图形用户界面的FTP客户端,保证文件的安全传输和存储。(2)提供登录界面,上传下载界面、帮助界面、关于界面。(3)通过输入服务器地址、用户名和密码,可以实现远程FTP主机的登录。(4)提供本地文件和文件夹的上传功能,可对FTP主机文件进行下载和删除文件。(5)提供对本地目录的读取与返回,能正确列出文件和文件夹,在没有登录服务器前可以作为一个简单的文件查询工具对本地文件进行查询。(6)帮助页面可以对用户提供使用说明。(7)关于界面包含设计者的信息.(9)要求开发出的FTP客户端符合标准FTP协议规范,支持ASCII传输模式和二进制数据传输模式(10)FTP的两种工作模式的选择Port模式(主动)和Passive模式(被动)2、开发环境与工具(1)使用的IDE:使用VC++6。0作为开发环境IDE(2)使用的语言:C++(3)使用的开发包:使用MFC和WinInet(4)开发平台:Windows73、所需要知识(1)计算机网络的基本知识(2)了解FTP基本实现原理(2)使用VC++6.0IDE进行MFC程序开发的基本知识(3)熟悉WinInet中属于FTP部分的操作(4)熟悉文件或文件夹操作(5)熟悉控件的操作,如在ListCtrol添加图片(浏览文件或文夹的图标)二、知识理解1、FTP实现的基本原理(1)概要Internet是一个非常复杂的计算机环境,Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的HYPERLINK"http://baike.baidu.com/view/899.htm"\t"_blank"服务器,也有运行Dos、Windows的PC机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可下载或上传文件.(2)上传和下载"下载”文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上(3)用户FTP和匿名FTP用户FTP:种方式为已在FTP服务器上建立了特定帐号的用户使用,需要合法的用户名和密码才能登录到远程计算机传输文件.匿名FTP:用户作为“anonymous"登录到FTP服务器,不需要有自己的用户名和密码。(4)ASCII和BinaryASCII:文本传输器使用ASCII字符,并由回车键和换行符分开Binary:二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。(5)Port和PassivePort模式(主动):FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。FTPserver必须和客户端建立一个新的连接用来传送数据。Passive模式(被动):Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令.FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTPserver不再需要建立一个新的和客户端之间的连接。三、完成进度1、已完成部分(1)实现一个图形用户界面的FTP客户端,保证文件的安全传输和存储.(2)提供登录界面,上传下载界面、帮助界面、关于界面(3)通过输入服务器地址、用户名和密码,可以实现远程FTP主机的登录.(4)提供本地文件上传功能,可对FTP主机文件进行下载和删除文件。(5)提供对本地目录的读取与返回,能正确列出文件和文件夹,在没有登录服务器前可以作为一个简单的文件查询工具对本地文件进行查询。(6)帮助页面可以对用户提供使用说明。(7)关于界面包含设计者的信息(帮助界面和关于界面整合在一起)。(9)支持ASCII传输模式和二进制数据传输模式,外加自动选择的模式(10)FTP的两种工作模式的选择Port模式(主动)和Passive模式(被动)(11)提供用户操作的状态信息输出2、未完成部分只提供了本地文件的上传功能,暂时不能提供文件夹的上传功能,由于当初没有使用多线程对服务器端进行操作,若上传或下载的文件过大,会导致界面陷入长时间的不响应中。由于时间问题,就不再进行多线程的扩充,也就不提供文件夹的上传功能。3、还需改善的部分(1)使用多线程进行操作(2)提供文件夹上传和文件夹下载功能(3)改进界面,提供更方便的操作(4)增加上传和下载的队列(5)同时可连接多个FTP服务器(6)改善提示信息(7)账户.密码等用户资料在本地加密后保存(8)增加更多的功能,如下载完成后关机等(9)等………四、FTP服务工作程 五、详细设计(1)CFtpDlg类的一些函数定义BOOLCFtpDlg::OnInitDialog(){ CDialog::OnInitDialog();ﻩ//Add"About。。.”menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystmandrange.ﻩ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;//使用二进制bPassive1=0;//使用主动myPort=21;ﻩm_imgList.Create(20,20,ILC_COLOR32,0,0);//创建图像列表m_imgList.SetBkColor(RGB(255,255,255));//文件夹图标hIconFold=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_FOLDER));//文件图标hIconFile=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_FILE)); m_imgList。Add(hIconFold);m_imgList.Add(hIconFile);m_ctrlLocalFile。SetImageList(&m_imgList,LVSIL_SMALL);//关联m_ctrlServerFile.SetImageList(&m_imgList,LVSIL_SMALL);//关联 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);//设置列m_ctrlLocalFile.InsertColumn(1,”文件类型",LVCFMT_LEFT,100,1);m_ctrlLocalFile.InsertColumn(2,”修改日期",LVCFMT_LEFT,100,2); m_ctrlServerFile。InsertColumn(0,"文件名",LVCFMT_LEFT,140,0);//设置列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;}//连接服务器voidCFtpDlg::OnBtnConnect(){ﻩ//TODO:Addyourcontrolnotificationhandlercodeherem_editServer。GetWindowText(m_strServer);//记录FTP服务器地址 CStringstrtemp; m_editPort.GetWindowText(strtemp);ﻩmyPort=::atoi(strtemp);//获得设置的端口号ﻩ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) {//设置成功,打开连接if(cFtpOpr.OpenConnection()) ﻩ{//连接成功 m_btnClo。EnableWindow(TRUE); ﻩﻩm_btnCon。EnableWindow(FALSE);ﻩ UpdateServerFile();//更新服务器的文件显示 ﻩ 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(){//关闭连接 if(cFtpOpr.CloseConnection()) {//关闭成功 ﻩ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); }}//双击本地文件列表控件中的选项voidCFtpDlg::OnDblclkListLocalfile(NMHDR*pNMHDR,LRESULT*pResult){ﻩ//TODO:AddyourcontrolnotificationhandlercodehereﻩPOSITIONp=m_ctrlLocalFile.GetFirstSelectedItemPosition();ﻩif(p==NULL) { return; }ﻩ//获取刚选取的位置的下标(从0开始的) intindex=m_ctrlLocalFile.GetNextSelectedItem(p);ﻩ//获得选中的内容 //得到第index行.第0列的内容(下标从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; ﻩ} ﻩ//删除当层的项目ﻩﻩ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=="文件”)ﻩ{//点到的是文件,进行上传ﻩﻩif(cFtpOpr。ReStatus()==2)ﻩﻩ{ ﻩcFtpOpr。PutFtpFile(m_strLocPath+FirstColumn,FirstColumn); ﻩﻩUpdateServerFile();//更新服务器的文件显示ﻩﻩ}ﻩ} *pResult=0;}voidCFtpDlg::OnDblclkListServerfile(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehereﻩ//获取选中的的一个位置 POSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition(); if(p==NULL)ﻩ{ return; }ﻩ//获取刚选取的位置的下标(从0开始的) intindex=m_ctrlServerFile。GetNextSelectedItem(p); //获得选中的内容,得到第index行。第0列的内容(下标从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();//更新服务器的文件显示 ﻩ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();//更新服务器的文件显示 ﻩCStringtemp;ﻩﻩm_ctrlServer.ResetContent();ﻩ cFtpOpr。GetPath(temp);ﻩ m_ctrlServer。AddString((LPSTR)(LPCTSTR)temp);m_ctrlServer.SetCurSel(0);ﻩ}ﻩelseif(SecondColumn=="文件") {//点到的是文件,进行下载ﻩﻩ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);}//选择了本地文件的组合框中的不同项目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();ﻩ}//点击了ASCII单选按钮voidCFtpDlg::OnAscii(){ﻩﻩbBinary1=0;}//点击了二进制单选按钮voidCFtpDlg::OnBinary(){ ﻩbBinary1=1;//使用二进制}//自动选择二进制或ASCII单选按钮voidCFtpDlg::OnAuto(){ﻩbBinary1=2;//自动}//主动方式单选按钮voidCFtpDlg::OnActive(){ bPassive1=0;}//被动方式单选按钮voidCFtpDlg::OnPassive(){ bPassive1=1;}//上传voidCFtpDlg::OnBtnup(){ﻩPOSITIONp=m_ctrlLocalFile.GetFirstSelectedItemPosition(); if(p==NULL) { return;ﻩ} //获取刚选取的位置的下标(从0开始的)ﻩintindex=m_ctrlLocalFile.GetNextSelectedItem(p);ﻩ//获得选中的内容 //得到第index行。第0列的内容(下标从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=="文件”) { ﻩ//点到的是文件,进行上传ﻩﻩif(cFtpOpr。ReStatus()==2) ﻩ{ﻩﻩﻩcFtpOpr.PutFtpFile(m_strLocPath+FirstColumn,FirstColumn);UpdateServerFile();//更新服务器的文件显示ﻩ } }}//下载voidCFtpDlg::OnBtndown(){ //TODO:Addyourcontrolnotificationhandlercodehere POSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition();ﻩif(p==NULL) {ﻩ return; } //获取刚选取的位置的下标(从0开始的)ﻩintindex=m_ctrlServerFile.GetNextSelectedItem(p);ﻩ//获得选中的内容 //得到第index行。第0列的内容(下标从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==”文件") { ﻩ//点到的是文件,进行下载ﻩﻩif(cFtpOpr。ReStatus()==2) ﻩ{ﻩﻩ //点到的是文件,进行下载ﻩ ﻩcFtpOpr。GetFtpFile(FirstColumn,m_strLocPath);ﻩ ListLocFile();//下载完成后更新本地文件显示 ﻩ} }}//删除服务器文件或文件夹voidCFtpDlg::OnBtndel(){ﻩPOSITIONp=m_ctrlServerFile.GetFirstSelectedItemPosition(); if(p==NULL) { return; }ﻩﻩ//获取刚选取的位置的下标(从0开始的) intindex=m_ctrlServerFile.GetNextSelectedItem(p); //获得选中的内容ﻩ//得到第index行。第0列的内容(下标从0开始) CStringFirstColumn=m_ctrlServerFile.GetItemText(index,0);CStringSecondColumn=m_ctrlServerFile。GetItemText(index,1);ﻩif(SecondColumn==”文件夹") {ﻩﻩif(cFtpOpr。ReStatus()==2)ﻩ { ﻩ//移除文件夹ﻩﻩﻩcFtpOpr.DeleteFTPf(FirstColumn,0);ﻩﻩﻩUpdateServerFile();//更新服务器的文件显示ﻩﻩ} ﻩ return;ﻩ}ﻩelseif(SecondColumn==”文件”)ﻩ{ﻩ if(cFtpOpr。ReStatus()==2) ﻩ{ //移除文件ﻩﻩﻩcFtpOpr.DeleteFTPf(FirstColumn,1);ﻩﻩ UpdateServerFile();//更新服务器的文件显示ﻩ }ﻩ}}voidCFtpDlg::UpdateServerFile()//更新服务器的文件显示{ ﻩﻩ //获得目录ﻩ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);}//复选框,是否匿名voidCFtpDlg::OnChkanonymous(){ﻩif(m_chkAnony.GetCheck()) {//被选上 bAnony=1;//使用匿名ﻩﻩm_editName.GetWindowText(m_strName);//记录FTP登陆用户名,用于不使用匿名后恢复 m_editPassword。GetWindowText(m_strPassword);//记录FTP登陆用户密码,用于不使用匿名后恢复m_editName.SetWindowText("anonymous"); ﻩ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);ﻩ}}(2)CFtpOperate的一些函数定义//构造函数CFtpOperate::CFtpOperate(){ﻩstrAppName。LoadString(AFX_IDS_APP_TITLE);//获得应用程序的名字 pInternetSession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);pEdiMes=NULL; if(!pInternetSession) { AfxMessageBox("初始化会话失败!”);ﻩﻩflag=-1;//初始化失败设为-1ﻩ return;ﻩ}ﻩflag=0;//初始化成功,标志初始化为0}//析构函数CFtpOperate::~CFtpOperate(){ pInternetSession—>Close();ﻩif(pInternetSession!=NULL)ﻩ{ﻩﻩdeletepInternetSession; }}//设置,由外部调用,把数据传进来boolCFtpOperate::set(CStringFullURL,CStringUserName,CStringPassword){ if(flag==-1)//类实例初始化时失败ﻩ{//重新设定strAppName。LoadString(AFX_IDS_APP_TITLE);//获得应用程序的名字ﻩﻩpInternetSession=newCInternetSession(strAppName,INTERNET_OPEN_TYPE_PRECONFIG);ﻩﻩif(!pInternetSession)ﻩ {ﻩ AfxMessageBox("初始化会话失败!"); ﻩﻩflag=-1;//初始化失败设为—1ﻩ return0;ﻩ }ﻩ flag=0; }ﻩ//flag不等于—1时才会进行以下设置ﻩm_strUserName=UserName;//用户名字 m_strPassword=Password;//用户密码ﻩm_strFullURL=FullURL;//设置路径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("未成功进行set调用”); ﻩ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服务器"+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);//设置服务器当前路径名ﻩm_strFullPath+=’/';ﻩ//解析成功后进行连接ﻩ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+=”准备连接FTP服务器”+m_strServerName+"。.....。.\r\n";ﻩ nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes—〉ReplaceSel(strTime);ﻩﻩ//当选择匿名的时候,m_strUserName为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();ﻩ 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服务器”+m_strServerName+"\r\n当前目录为:”+m_strFullPath+”\r\n”; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);pEdiMes->SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime);ﻩ flag=2;//连接成功后设为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;}//关闭连接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+="------——-—-—已关闭连接-——------\r\n”;ﻩnLength=pEdiMes-〉SendMessage(WM_GETTEXTLENGTH);ﻩpEdiMes->SetSel(nLength,nLength);ﻩpEdiMes->ReplaceSel(strTime);flag=1;//关闭成功ﻩreturn1;}//返回当前的状态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+=”下载文件,请稍候:"+remote+"。.。。.。。\r\n”;ﻩ nLength=pEdiMes—>SendMessage(WM_GETTEXTLENGTH);pEdiMes-〉SetSel(nLength,nLength);pEdiMes->ReplaceSel(strTime);ﻩpFtpConnection-〉SetCurrentDirectory(m_strFullPath); if(bBinary1==1) {ﻩ //二进制方式 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+=”下载出错,请重试\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+="上传文件,请稍候:"+local+"\r\n"; nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH); pEdiMes—>SetSel(nLength,nLength); pEdiMes->ReplaceSel(strTime); if(bBinary1==1) {//二进制方式ﻩﻩ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)ﻩﻩ{//自动方式ﻩﻩﻩ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+=”上传出错,请重试\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作为输出参数{ﻩ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(); //returnthenum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论