3.3.7 具体实现(4)
函数Recv()利用archive->ReadString(recvstr)读取服务器返回的数据或者其他信息。其中包括文件的属性等信息。
(5) 用户可以从服务器返回的数据中读取文件的属性。函数GetFileStatu()的实现代码如下:
- void CFtp::GetFileStatu(char car) //参数car表示接收到的数据
- {
- char buf[100] = {0}; //用于保存临时数据
- char ch = "a"; //初始化字符变量
- CString str = ""; //定义字符串
- int i=0, j=0; //定义循环变量
- for(int i=0; i<1024; i++) //循环解析消息数据以获得一条完整的信息
- {
- if(car[i] != "\") buf[i] = car[i]; //取得的信息不是"\",则保存到临时变量
- else
- {
- if(car[i+1] == "r") MessageBox("成功解析一条消息!");
- //如果取得的是结束符号,则提示成功提取
- }
- }
- while(ch!="" && i<1024)
- {
- if(buf[i]!="" && buf[i+1]==EOF) str += (CString)buf[i];
- //如果不是空格,则保存在字符串变量中
- else
- {
- ch = buf[i+1]; //如果是空格,则移动到下一个字符
- i += 1;
- j += 1;
- str = ""; //将字符串变量重置
- }
- switch(j) //根据变量j选择信息字符段
- {
- case 1:
- MessageBox("文件最后一次保存的日期是:%c", str);
- //打印文件各属性
- case 2:
- MessageBox("文件最后一次保存的时间是:%c", str);
- case 3:
- MessageBox("文件的大小是:%c", atoi(str));
- case 4:
- MessageBox("文件的名称是:%c", str);
- }
- }
- }
函数GetFileStatu()根据参数car所指向的接收内容数组,通过循环方式获取一条完整的信息,然后再从这条信息中取得各属性。
(6) CFtp类中很重要的作用是上传和下载文件,这两个功能的实现方法如下:
- void CFtp::UpdataFile(CString str) //参数str表示上传文件的路径
- {
- archive->WriteString("STOR " + "\r\n");
- //调用CArchive类的WriteString()函数发送STOR命令
- char buff[1024] = {0}; //设置缓冲区
- SOCKET sock; //与服务器建立连接成功后返回的套接字句柄
- CFile file(str, CFile::modeReadWrite); //关联文件对象并指定文件属性为可读可写
- file.Read(buff, 1024); //读取文件内容到缓冲区中
- file.close(); //读取完毕,关闭文件
- ::Send(sock, buff, 1024, NULL); //调用Send()函数发送文件内容到FTP文件
- }