FTPDownFile.cpp
资源名称:Client.rar [点击查看]
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:23k
源码类别:
浏览器
开发平台:
Visual C++
- /*! @ftpdownfile.cpp
- ********************************************************************************
- <PRE>
- 模块名 : FTP下载功能实现文件
- 文件名 : ftpdownfile.cpp
- 相关文件 : ftpdownfile.h
- 文件实现功能 : 实现文件在后头提供过FTP协议下载
- 作者 : 刘俊
- 版本 : 1.0
- --------------------------------------------------------------------------------
- 备注 : -
- --------------------------------------------------------------------------------
- 修改记录 :
- 日 期 版本 修改人 修改内容
- 2010/02/08 1.0 刘俊 创建
- </PRE>
- ********************************************************************************
- * 版权所有(c) 2010, 17JAGO, 保留所有权利
- *******************************************************************************/
- #include "StdAfx.h"
- #include ".ftpdownfile.h"
- using namespace std;
- // 引入winsock lib文件
- #pragma comment(lib,"ws2_32.lib")
- // 构造函数
- CFTPDownFile::CFTPDownFile(void)
- {
- }
- // 析构函数
- CFTPDownFile::~CFTPDownFile(void)
- {
- // 释放资源
- ::WSACleanup();
- }
- /*! @SetFTPinfo
- ********************************************************************************
- <PRE>
- 函数名 : SetFTPinfo
- 功能 : FTP网络信息初始化设定,包括IP,端口,用户名,密码
- 参数 : [IN] pFTP_SERVER_IP : 端点服务器的IP地址
- [IN] usPort : 端点服务器FTP端口
- [IN] pUsername : 端点服务器FTP用户名
- [IN] pPwd : 端点服务器FTP密码
- 返回值 : 设置成功返回TRUE,失败返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : 如果pUsername和pPwd都为NULL,则分别设置为匿名用户和空密码
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- bool CFTPDownFile::SetFTPinfo(const char *pFTP_SERVER_IP, USHORT usPort, const char *pUsername, const char *pPwd)
- {
- // 参数检查
- if ((pFTP_SERVER_IP == NULL) || (0 == usPort))
- {
- return false;
- }
- // 删除原来的信息
- ZeroMemory(this->m_chFTPIP, sizeof(this->m_chFTPIP));
- ZeroMemory(this->m_chUserName,sizeof(this->m_chUserName));
- ZeroMemory(this->m_chFTPPwd, sizeof(this->m_chFTPPwd));
- // 写入新值
- strcpy(this->m_chFTPIP, pFTP_SERVER_IP);
- this->m_usPort = usPort;
- // 用户名设置
- if (pUsername)
- {
- strcpy(this->m_chUserName, pUsername);
- }
- else
- {
- strcpy(this->m_chUserName, "Anonymous");
- }
- // 密码设置
- if (pUsername)
- {
- strcpy(this->m_chFTPPwd, pPwd);
- }
- else
- {
- strcpy(this->m_chFTPPwd, "");
- }
- // 填充命令sockaddr_in结构
- this->m_sinCommand.sin_family = AF_INET;
- // 设定端口
- this->m_sinCommand.sin_port = htons(this->m_usPort);
- // 设定IP
- this->m_sinCommand.sin_addr.S_un.S_addr = inet_addr(this->m_chFTPIP);
- // 返回
- return true;
- }
- /*! @SOCKETINIT
- ********************************************************************************
- <PRE>
- 函数名 : SOCKETINIT
- 功能 : FTP网络类SOCKET版本检查初始化工作
- 参数 : -
- 返回值 : 初始化成功返回TRUE,失败返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- bool CFTPDownFile::SOCKETINIT()
- {
- // 定义版本号
- WORD wVersionRequested;
- // 定义WSADATA结构
- WSADATA wsaData;
- int nErr;
- wVersionRequested = MAKEWORD( 1, 1 );
- // WINSOCK初始化
- nErr = WSAStartup( wVersionRequested, &wsaData );
- if ( nErr != 0 )
- {
- return false;
- }
- // 检查版本号
- if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1)
- {
- return false;
- }
- //返回
- return true;
- }
- /*! @ConectFTPCOMMAND
- ********************************************************************************
- <PRE>
- 函数名 : ConectFTPCOMMAND
- 功能 : FTP连接命令通道
- 参数 : -
- 返回值 : 连接成功,返回TRUE,否则返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- bool CFTPDownFile::ConectFTPCOMMAND()
- {
- // 命令SOCKET初始化
- this->m_sockCOMMAND = ::socket(AF_INET, SOCK_STREAM, 0);
- if (this->m_sockCOMMAND == INVALID_SOCKET)
- {
- return false;
- }
- // 进行连接
- if (connect(this->m_sockCOMMAND, (sockaddr*)&this->m_sinCommand, sizeof(this->m_sinCommand)) == SOCKET_ERROR)
- {
- return false;
- }
- // 初始化接受信息BUFF
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- // 接受FTP服务器返回的信息
- if (recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0) < 1)
- {
- return false;
- }
- return true;
- }
- /*! @CloseCommandConect
- ********************************************************************************
- <PRE>
- 函数名 : CloseCommandConect
- 功能 : FTP命令通道关闭
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::CloseCommandConect()
- {
- // 关闭命令通道SOCKET连接
- closesocket(this->m_sockCOMMAND);
- }
- /*! @GetFTPRecvMsg
- ********************************************************************************
- <PRE>
- 函数名 : GetFTPRecvMsg
- 功能 : 取得FTP返回的信息
- 参数 : -
- 返回值 : -FTP返回信息字符串BUF地址
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- char* CFTPDownFile::GetFTPRecvMsg()
- {
- return this->m_chRecvFTPmessage;
- }
- /*! @SendUsername
- ********************************************************************************
- <PRE>
- 函数名 : SendUsername
- 功能 : FTP命令链接发送FTP用户名
- 参数 : -
- 返回值 : 发送成功返回 >0的整数,失败返回值 =0;
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- int CFTPDownFile::SendUsername()
- {
- //存放命令的字符串
- char chCommand[200] = {0};
- int iRes = 0;
- // 发送FTP用户名
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "USER ");
- strcat(chCommand, this->m_chUserName);
- strcat(chCommand, "rn");
- // 发送
- iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- if (recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0) < 1)
- {
- return 0;
- }
- return iRes;
- }
- /*! @SendPWD
- ********************************************************************************
- <PRE>
- 函数名 : SendPWD
- 功能 : FTP命令链接发送FTP用户密码
- 参数 : -
- 返回值 : 发送成功返回 >0的整数,失败返回值 =0;
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- int CFTPDownFile::SendPWD()
- {
- //存放命令的字符串
- char chCommand[200] = {0};
- int iRes = 0;
- // 发送密码
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "PASS ");
- strcat(chCommand, this->m_chFTPPwd);
- strcat(chCommand, "rn");
- // 发送
- iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- if (recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0) < 1)
- {
- return 0;
- }
- return iRes;
- }
- /*! @GetFTPfilesize
- ********************************************************************************
- <PRE>
- 函数名 : GetFTPfilesize
- 功能 : 取得所要下载的文件的大小
- 参数 : -
- 返回值 : 成功返回TRUE,否则返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- bool CFTPDownFile::GetFTPfilesize()
- {
- //存放命令的字符串
- char chCommand[200] = {0};
- // 设置按位下载
- memset(chCommand, 0, sizeof(chCommand));
- sprintf(chCommand,"TYPE Irn");
- send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0);
- // 发送获取大小命令
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "SIZE ");
- strcat(chCommand, this->m_chFTPfilename);
- strcat(chCommand, "rn");
- // 发送
- int iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- if (recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0) < 1)
- {
- return false;
- }
- char *pchSize = NULL;
- pchSize = strchr(this->m_chRecvFTPmessage, ' ');
- pchSize++;
- this->m_dFTPfilesize = strtod(pchSize, NULL);
- // 验证取得大小是否大于0
- if (fabs(this->m_dFTPfilesize) < 1)
- {
- return false;
- }
- return true;
- }
- /*! @SetFTPdownfilename
- ********************************************************************************
- <PRE>
- 函数名 : SetFTPdownfilename
- 功能 : 设置下载文件名和下载到本地的文件名,包含路径
- 参数 : [IN] pchFTPfilename : 端点服务器的FTP文件路径和文件名
- [IN] pchLocalfilename : 下载到本地后的文件名,包含本地文件路径
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : pchFTPfilename是相对于FTP根目录的路径及文件名不用报还FTP:\192.168.1.100这样的地址
- 典型用法 : SetFTPdownfilename("test.txt", "c:\test\test.txt");
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::SetFTPdownfilename(const char *pchFTPfilename, const char *pchLocalfilename)
- {
- // 设置FTP文件名
- if(!pchFTPfilename)
- {
- return;
- }
- ZeroMemory(this->m_chFTPfilename, sizeof(this->m_chFTPfilename));
- strcpy(this->m_chFTPfilename, pchFTPfilename);
- // 设置本地文件名
- if(!pchLocalfilename)
- {
- return;
- }
- ZeroMemory(this->m_chLocalfilename, sizeof(this->m_chLocalfilename));
- strcpy(this->m_chLocalfilename, pchLocalfilename);
- }
- /*! @WriteLOG
- ********************************************************************************
- <PRE>
- 函数名 : WriteLOG
- 功能 : 在程序目录生成一个log.txt,记录LOG信息
- 参数 : [IN] pLog : 要打印的LOG内容
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 :
- 典型用法 :
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::WriteLOG(const char *pLog)
- {
- // 取系统当前时间
- CString strTime = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
- // 取系统当前日期
- CString strDate = CTime::GetCurrentTime().Format("%Y-%m-%d");
- CString strLog = CString(pLog);
- // 记录路径用
- char *pchPath = new char[1024];
- // 取得当前路径
- GetCurrentDirectory(1024,pchPath);
- CString strPath;
- strPath=pchPath;
- strPath=strPath + "\log.txt";
- // 打开或创建文件
- CStdioFile fLog(strPath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);
- // 文件移到最后
- fLog.SeekToEnd();
- CString str;
- str += "n";
- str = strTime + " " + strLog + str;
- // 写入文件
- fLog.WriteString(str);
- // 关闭文件
- fLog.Close();
- // 释放资源
- strTime="";
- strDate="";
- delete [] pchPath;
- pchPath = NULL;
- strPath.Empty();
- strLog.Empty();
- }
- /*! @Startdown
- ********************************************************************************
- <PRE>
- 函数名 : Startdown
- 功能 : 开始下载指定的文件
- 参数 : [IN] pchFTPfilename : 端点服务器的FTP文件路径和文件名
- [IN] pchLocalfilename : 下载到本地后的文件名,包含本地文件路径
- [IN] bRestart : 指定是否需要重新下载或者端点续传,TURE表示重新下载,FALSE表示断点续传
- 返回值 : 下载失败返回0,顺利完成下载返回1,文件已存在返回2
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : pchFTPfilename是相对于FTP根目录的路径及文件名不用报还FTP:\192.168.1.100这样的地址
- 典型用法 : Startdown("test.txt", "c:\test\test.txt", false);
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- short CFTPDownFile::Startdown(const char *pchFTPfilename, const char *pchLocalfilename, bool bRestart)
- {
- // 本地文件的大小
- double dLocalfilesize = 0.0;
- ULONGLONG ullLocalfilesize = 0;
- CFileException e;
- // 参数检查
- if(!pchFTPfilename)
- {
- return -1;
- }
- if(!pchLocalfilename)
- {
- return -1;
- }
- // 设置文件名
- this->SetFTPdownfilename(pchFTPfilename, pchLocalfilename);
- // 取得要下载文件的大小
- if (!this->GetFTPfilesize())
- {
- return 0;
- }
- // 判断文件路径是否存在,不存在的话则创建
- CString strLocalfilename = CString(pchLocalfilename);
- strLocalfilename.Replace("/", "\");
- this->CreatePath(strLocalfilename);
- // 如果重新下载
- if (bRestart)
- {
- this->m_fLocalfile.Open(pchLocalfilename, CFile::modeCreate | CFile::modeWrite, &e);
- }
- // 断点续传
- else
- {
- this->m_fLocalfile.Open(pchLocalfilename, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite, &e);
- // 获得当地文件的大小
- dLocalfilesize = this->m_fLocalfile.SeekToEnd();
- // 如果不重新下载,且文件大小已经和服务器上医院大,则返回
- if (fabs(this->m_dFTPfilesize - dLocalfilesize) < 0.1)
- {
- this->m_fLocalfile.Close();
- return 2;
- }
- // 如果文件大小超过FTP上的文件,则视为错误文件,重新下载
- else if (this->m_dFTPfilesize < dLocalfilesize)
- {
- this->m_fLocalfile.Close();
- this->m_fLocalfile.Open(pchLocalfilename, CFile::modeCreate | CFile::modeWrite, &e);
- dLocalfilesize = 0;
- }
- else
- {
- ullLocalfilesize = dLocalfilesize;
- }
- }
- // 让FTP服务器进入监听状态
- this->SendFTPListenCommand();
- // 如果本地文件已有大小,且是断点续传
- if (1 < fabs(dLocalfilesize) && dLocalfilesize < this->m_dFTPfilesize)
- {
- if (!bRestart)
- {
- // 发送文件偏移指令
- this->SendFTPFileSeek(ullLocalfilesize);
- }
- }
- // 发送开始接收文件命令
- this->SendFTPstartsendfile();
- // 接收FTP文件,写入本地硬盘
- CWinThread *pThread = AfxBeginThread((AFX_THREADPROC)this->RevandWritefile, LPVOID(this));
- // 等待线程结束
- bool bQuit = false;
- while (!bQuit)
- {
- MSG msg;
- int rc;
- // 等待下载线程结束
- rc = MsgWaitForMultipleObjects(1, &pThread->m_hThread, FALSE, INFINITE, QS_ALLINPUT);
- if (rc == (WAIT_OBJECT_0))
- {
- // 下载完成,则退出
- break;
- }
- PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
- if (msg.message == WM_QUIT)
- {
- // 停止下载
- this->m_bDown = false;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- // 关闭打开的文件
- if (this->m_fLocalfile.GetFileName() != "")
- {
- this->m_fLocalfile.Close();
- }
- // 关闭SOCKET
- closesocket(this->m_sockDATA);
- closesocket(this->m_sockCOMMAND);
- return 1;
- }
- /*! @SendFTPListenCommand
- ********************************************************************************
- <PRE>
- 函数名 : SendFTPListenCommand
- 功能 : 发送FTP命令,让FTP服务器进入监听模式
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 :
- 典型用法 :
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::SendFTPListenCommand()
- {
- // 存放命令的字符串
- char chCommand[200] = {0};
- // 发送获取大小命令
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "PASVrn");
- // 发送
- int iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0);
- const char * pdir;
- pdir=strchr(this->m_chRecvFTPmessage,'(');
- pdir++;
- // 获取FTP服务器IP地址用
- union
- {
- unsigned char b[4];
- unsigned __int32 ui;
- }uip;
- union
- {
- unsigned char b[2];
- unsigned __int16 hi;
- }uport;
- unsigned __int32 u32[6];
- sscanf(pdir,"%u,%u,%u,%u,%u,%u",&u32[0],&u32[1],&u32[2],&u32[3],&u32[4],&u32[5],&u32[6]);
- uip.b[3]=(unsigned char)u32[0];
- uip.b[2]=(unsigned char)u32[1];
- uip.b[1]=(unsigned char)u32[2];
- uip.b[0]=(unsigned char)u32[3];
- uport.b[1]=(unsigned char)u32[4];
- uport.b[0]=(unsigned char)u32[5];
- // 初始化数据传输SOCKET
- this->m_sockDATA = socket(AF_INET,SOCK_STREAM,0);
- sockaddr_in myaddr;
- memset(&myaddr,0,sizeof(sockaddr_in));
- myaddr.sin_family = AF_INET;
- myaddr.sin_addr.S_un.S_addr = htonl(uip.ui);
- myaddr.sin_port = htons(uport.hi);
- //连接服务端
- iRes = 0;
- iRes = connect(this->m_sockDATA,(LPSOCKADDR)&myaddr,(int)sizeof(sockaddr_in));
- if (iRes == SOCKET_ERROR)
- {
- AfxMessageBox("建立接收数据链接失败");
- }
- }
- /*! @SendFTPFileSeek
- ********************************************************************************
- <PRE>
- 函数名 : SendFTPFileSeek
- 功能 : 发送文件偏移命令
- 参数 : [IN] ullFilesize : 端点服务器的FTP文件偏移大小
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::SendFTPFileSeek(ULONGLONG ullFilesize)
- {
- // 存放命令的字符串
- char chCommand[200] = {0};
- char chFilesize[100] = {0};
- _i64toa(ullFilesize, chFilesize, 10);
- // 发送获取大小命令
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "REST ");
- strcat(chCommand, chFilesize);
- strcat(chCommand, "rn");
- // 发送
- int iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0);
- }
- /*! @SendFTPstartsendfile
- ********************************************************************************
- <PRE>
- 函数名 : SendFTPstartsendfile
- 功能 : 发送开始接收文件命令
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::SendFTPstartsendfile()
- {
- // 存放命令的字符串
- char chCommand[200] = {0};
- char chFilesize[100] = {0};
- // 发送获取大小命令
- memset(chCommand, 0, sizeof(chCommand));
- strcpy(chCommand, "RETR ");
- strcat(chCommand, this->m_chFTPfilename);
- strcat(chCommand, "rn");
- // 发送
- int iRes = send(this->m_sockCOMMAND, chCommand, strlen(chCommand), 0);
- // 接受返回信息
- ZeroMemory(this->m_chRecvFTPmessage, INTRECVMSGSIZE);
- recv(this->m_sockCOMMAND, this->m_chRecvFTPmessage, INTRECVMSGSIZE, 0);
- }
- /*! @RevandWritefile
- ********************************************************************************
- <PRE>
- 函数名 : RevandWritefile
- 功能 : 接收FTP文件,写入本地硬盘
- 参数 : [IN] pParam : 该类的this指针
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- UINT CFTPDownFile::RevandWritefile(LPVOID pParam)
- {
- // 还原this指针
- CFTPDownFile *pointer;
- pointer = (CFTPDownFile*)pParam;
- // 设定下载缓冲区大小
- const int BUFFSIZE = 8*1024;
- char revbuf[BUFFSIZE] = {0};
- // 接收返回值
- int iresult = 0;
- // 设置接收状态
- pointer->m_bDown = true;
- // 接收大小初始化
- pointer->m_dRecv = 0;
- // 开始接收数据
- while(true)
- {
- // 重置BUFF区
- memset(revbuf,0,BUFFSIZE);
- // 重置接收返回值
- iresult = 0;
- // 接收
- iresult = recv(pointer->m_sockDATA , revbuf, BUFFSIZE, 0);
- //累加记录下载了多少字节
- pointer->m_dRecv = pointer->m_dRecv + iresult;
- // 如果接收完毕,停止接收
- if(iresult == 0)
- {
- break;
- }
- // 写入文件
- pointer->m_fLocalfile.Write(revbuf, iresult);
- // 如果用户停止下载
- if (!pointer->m_bDown)
- {
- // 关闭资源
- pointer->m_fLocalfile.Close();
- closesocket(pointer->m_sockDATA);
- closesocket(pointer->m_sockCOMMAND);
- break;
- }
- }
- return 0;
- }
- /*! @Stopdown
- ********************************************************************************
- <PRE>
- 函数名 : Stopdown
- 功能 : 停止下载
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::Stopdown()
- {
- // 修改下载状态
- this->m_bDown = false;
- }
- // 检查文件路径是否存在,不存在的话则创建
- /*! @CreatePath
- ********************************************************************************
- <PRE>
- 函数名 : CreatePath
- 功能 : 检查文件路径是否存在,不存在的话则创建
- 参数 : [IN] strPath : 要检查的路径
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CFTPDownFile::CreatePath(CString strPath)
- {
- // 要检查的目录路径,从最顶级开始
- CString strTemp;
- int nPos = 1;
- while (nPos < strPath.GetLength())
- {
- nPos++;
- nPos = strPath.Find("\", nPos);
- if (-1 == nPos)
- {
- return;
- }
- // 逐级取得路径
- CString strTemp = strPath.Left(nPos);
- // 检查是否存在该路径
- if (!PathFileExists(strTemp))
- {
- // 创建目录
- CreateDirectory(strTemp, NULL);
- }
- }
- }