3.3.7 具体实现(5)
函数UpdataFile()能够根据参数str所指定的本地文件路径上传文件。首先读取本地文件内容到缓冲区中,利用函数Send()将缓冲区的内容发送到服务器。
(7) 下载文件函数DownLoadFile()的实现方法与函数UpdataFile()一样,其具体实现代码如下:
- void CFtp::DownLoadFile(CString filename)
- //参数filename表示从列表中获取的文件名
- {
- int lenth; //已经获取的文件大小
- int i = 0;
- archive->WriteString("RETR " + "\r\n");
- //调用CArchive类的WriteString()函数发送RETR命令
- archive->WriteString(filename + "\r\n"); //向服务器发送将要下载的文件名称
- char buff[1024] = {0}; //设置缓冲区
- SOCKET sock; //与服务器建立连接成功后返回的套接字句柄
- CFile file(filename, CFile::modeReadWrite);//建立文件并指定文件属性为可读可写
- while(lenth != 0)
- {
- ::Recv(sock, buff, 1024, NULL); //在套接字上接收数据到缓冲区中
- file.Write(buff, 1024); //将缓冲区内容写到文件中
- lenthlenthlenth = lenth - 1024; //从文件总大小中减去已经接收并写入文件中的大小
- }
- }
这样就实现了以CFtp类封装发送命令、接收数据、获取文件属性和上传下载文件等FTP主要操作。当在程序中使用该类时,应将其头文件Ftp.h和Ftp.cpp加入到工程中,然后创建CFtp类对象,对各函数进行调用即可。
3. 使用CFtp类
当定义CFtp类后,在程序中就可以使用此类实现具体功能了。
用户登录服务器的方式可以是程序默认的匿名登录,也可以使用指定账号登录。其响应代码如下:
- void CFTPDlg::OnRadio2()
- {
- this->GetDlgItem(IDC_EDIT3)->EnableWindow(true); //操作IDC_EDIT3编辑框
- this->GetDlgItem(IDC_EDIT4)->EnableWindow(true); //操作IDC_EDIT4编辑框
- }
当输入服务器IP地址等信息后,单击"连接服务器"按钮,程序根据用户提供的信息对服务器进行连接。该按钮对应的消息响应函数代码如下:- void CFTPDlg::OnConnect()
- {
- CString str, str1; //定义字符串变量
- int port = 0; //定义端口变量
- this->GetDlgItem(IDC_EDIT1)->GetWindowText(str); //获取IP字符串
- this->GetDlgItem(IDC_EDIT2)->GetWindowText(str1); //获取端口号码
- port = (int)atoi(str1); //将端口字符串转换成数字
- if(ftp.FTPConnect(str, port)) //调用CFtp对象的函数进行连接
- {
- this->GetDlgItem(IDC_EDIT5)->
- SetWindowText("连接成功!"); //通知用户连接状态
- this->GetDlgItem(IDC_Connect)->EnableWindow(false);
- //连接成功后,设置连接按钮为失效状态
- ftp.Send("LIST/r/n"); //发送命令获取文件列表信息
- str = ftp.Recv(); //接收数据
- ftp.GetFileStatu(str.GetAt(0)); //获取文件名称
- }
- }
当客户端启动时可以获取到本地默认文件夹下的文件。在Visual C++(www.cppentry.com)中,查找文件的API函数是FindFirstFile()和FindNextFile()。函数原型分别如下:- //开始查找文件并获得其句柄
- HANDLE FindFirstFile(
- LPCTSTR lpFileName,
- FINDEX_INFO_LEVELS fInfoLevelId,
- LPVOID lpFindFileData,
- FINDEX_SEARCH_OPS fSearchOp,
- LPVOID lpSearchFilter,
- DWORD dwAdditionalFlags
- );
-
- /从当前位置查找下一个文件
- BOOL FindNextFile(
- HANDLE hFindFile,
- LPWIN32_FIND_DATA lpFindFileData
- );