CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

如何在程序中实现下载FTP,及判断下载状态,当下载完闭后将zip文件自动解压到指定目录。

楼主jing()2000-01-30 13:40:00 在 VC/MFC / 基础类 提问

最好有sdk   or   mfc   or   vb的SOURCE   CODE 问题点数:100、回复次数:4Top

1 楼radish()回复于 2000-01-30 14:22:00 得分 20

下载例子到http://codeguru.developer.com/index.shtml,调用ZIP可以用SHELLEXECUTE调用Top

2 楼WHQ()回复于 2000-01-30 14:44:00 得分 80

<pre>  
  给你一个用SDK写的例子,链接时要加上wininet.lib,这段代码中没有加上回调函数,所以无法得知下载的状态,因此我又在后面给也了两个回调函数,你在打开会话及连接后,把这两个回调函数设上即可  
   
  #include   "stdafx.h"  
  #include   <wininet.h>  
  #include   <stdio.h>  
  #include   <shellapi.h>  
   
  int   DownloadFile(LPCTSTR   szAgent,   LPCTSTR   szFtpSite,   LPCTSTR   szFilePath,   LPCTSTR   szDestFile,   int   cDelimit);  
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
                                            HINSTANCE   hPrevInstance,  
                                            LPSTR           lpCmdLine,  
                                            int               nCmdShow)  
  {  
    //   TODO:   Place   code   here.  
  char         *szFtpSite     =   "128.8.72.156";  
  char         *szFile           =   "/pub/etc/cibas.zip";  
  char         *szDestFile   =   "D:\\temp\\cibas.zip";  
  char           szMessage[1024];  
   
  memset(szMessage,   0x00,   1024);  
   
  switch(   DownloadFile("Download",   szFtpSite,   szFile,   szDestFile,   '/')   )  
  {  
  case   -1   :  
  MessageBox(NULL,   "Can't   open   internet",   "Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  case   -2   :  
  sprintf(szMessage,   "Can't   connect   to   ftp   site   %s",   szFtpSite);  
  MessageBox(NULL,   szMessage,   "Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  case   -3   :  
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,   NULL,   GetLastError(),   0,   szMessage,   1024,   NULL);  
  MessageBox(NULL,   szMessage,   "System   Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  case   -4   :  
  sprintf(szMessage,   "The   specified   file   <%s>   not   found   on   ftp   site   <%s>.",   szFile,   szFtpSite);  
  MessageBox(NULL,   szMessage,   "Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  case   -5   :  
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,   NULL,   GetLastError(),   0,   szMessage,   1024,   NULL);  
  MessageBox(NULL,   szMessage,   "System   Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  case     0   :  
  sprintf(szMessage,   "The   file   <%s>   has   been   downloaded   successfully.   Would   you   like   to   open   it   now?",   szDestFile);  
  if(   MessageBox(NULL,   szMessage,   "Download   notification",   MB_YESNO     and     MB_ICONQUESTION)   ==   IDYES   )  
  {  
  if(   (DWORD)ShellExecute(NULL,   "open",   szDestFile,   NULL,   NULL,   SW_SHOW)   <=   32   )  
  MessageBox(NULL,   szDestFile,   "Can't   open   the   file.",   MB_OK     and     MB_ICONEXCLAMATION);  
  }  
  break;  
  default   :  
  MessageBox(NULL,   "Unknown   error",   "Error   Message",   MB_OK     and     MB_ICONEXCLAMATION);  
  break;  
  }  
  return   0;  
  }  
   
  int   DownloadFile(LPCTSTR   szAgent,   LPCTSTR   szFtpSite,   LPCTSTR   szFilePath,   LPCTSTR   szDestFile,   int   cDelimit)  
  {  
  HINTERNET         hSession,     hConnect,   hFindFile;  
  char                   szPathName[260];  
  char                   szFileName[256];  
  char                   szMessage[1024];  
  BOOL                   bFileFound;  
  DWORD                         dwLength;  
  WIN32_FIND_DATA     FindData;  
  char*       lpFilePart;  
   
  memset(&FindData,   0x00,   sizeof(WIN32_FIND_DATA));  
  memset(szPathName,   0x00,   260);  
  memset(szMessage,   0x00,   1024);  
  memset(szFileName,   0x00,   256);  
   
  if(   szAgent   ==   NULL     and     and     *szAgent   ==   0   )  
  hSession   =   InternetOpen("anonymous",   INTERNET_OPEN_TYPE_PRECONFIG,   NULL,   NULL,   0);  
  else  
  hSession   =   InternetOpen(szAgent,   INTERNET_OPEN_TYPE_PRECONFIG,   NULL,   NULL,   0);  
  if(   hSession   ==   NULL   )  
  return   -1;  
   
  dwLength   =   128;  
  InternetCanonicalizeUrl(szFtpSite,   szMessage,   &dwLength,   ICU_DECODE     and     ICU_NO_ENCODE);  
  hConnect   =   InternetConnect(hSession,   szMessage,   0,   NULL,   NULL,   INTERNET_SERVICE_FTP,   0,   1);  
  if(   hConnect   ==   NULL   )  
  {  
  InternetCloseHandle(   hSession   );  
  return   -2;  
  }  
  lstrcpy(szPathName,   szFilePath);  
  lpFilePart   =   strrchr(szPathName,   cDelimit);  
  if(   lpFilePart   ==   NULL   )  
  {  
  lstrcpy(szFileName,   szFilePath);  
  lstrcpy(szPathName,   "/");  
  }  
  else  
  {  
  lstrcpy(szFileName,   ++lpFilePart);  
  *lpFilePart   =   0;  
  }  
  FtpSetCurrentDirectory(hConnect,   szPathName);  
   
  hFindFile   =   FtpFindFirstFile(hConnect,   "*.*",   &FindData,   INTERNET_FLAG_RELOAD,   1);  
  if(   hFindFile   ==   NULL   )  
  {  
  InternetCloseHandle(   hSession   );  
  InternetCloseHandle(   hConnect   );  
  return   -3;  
  }  
  bFileFound   =   FALSE;  
  while(   1   )  
  {  
  if(   _stricmp(FindData.cFileName,   szFileName)   ==   0   )  
  {  
  bFileFound   =   TRUE;  
  break;  
  }  
  if(   !InternetFindNextFile(hFindFile,   &FindData)   )  
  break;  
  }  
  InternetCloseHandle(   hFindFile   );  
  if(   !bFileFound   )  
  return   -4;  
   
  if(   !FtpGetFile(hConnect,   FindData.cFileName,   szDestFile,   FALSE,   FILE_ATTRIBUTE_NORMAL,   FTP_TRANSFER_TYPE_BINARY,   1)   )  
  {  
  InternetCloseHandle(   hSession   );  
  InternetCloseHandle(   hConnect   );  
  return   -5;  
  }  
  InternetCloseHandle(   hConnect   );  
  InternetCloseHandle(   hSession   );  
   
  return   0;  
  }  
   
  //   以下是回调函数  
  void   CALLBACK   CUpdateOnlineDlg::ICBSession(HINTERNET   /*hInternet*/,   DWORD   dwContext,   DWORD   dwInternetStatus,  
    LPVOID   /*lpvStatusInformation*/,   DWORD   /*dwStatusInformationLength*/)  
  {  
  if(   !m_pThisDlg   )  
  return;  
   
  if(   dwContext   !=   CONTEXT_CONNECT/*     and     and     hInternet   !=   m_pThisDlg->m_hSession*/   )  
  return;  
   
  switch(   dwInternetStatus   )  
  {  
  case   INTERNET_STATUS_CONNECTING_TO_SERVER   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在连接到服务器..."));  
  break;  
  case   INTERNET_STATUS_CONNECTED_TO_SERVER   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在连接到服务器...连接成功。"));  
  break;  
  case   INTERNET_STATUS_CLOSING_CONNECTION   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在关闭与服务器的连接..."));  
  break;  
  case   INTERNET_STATUS_CONNECTION_CLOSED   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在关闭与服务器的连接...已关闭。"));  
  break;  
  case   INTERNET_STATUS_RESOLVING_NAME   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在查找服务器..."));  
  break;  
  case   INTERNET_STATUS_NAME_RESOLVED   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正在查找服务器...已找到。"));  
  break;  
  // case   INTERNET_STATUS_REDIRECT   :   //   此处未使用  
  // m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("连接被重定向。"));  
  // break;  
  case   INTERNET_STATUS_HANDLE_CREATED   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("已创建通信端口。"));  
  break;  
  case   INTERNET_STATUS_HANDLE_CLOSING   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("已关闭通信端口。"));  
  break;  
  case   INTERNET_STATUS_SENDING_REQUEST   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("正发送请求至服务器..."));  
  break;  
  case   INTERNET_STATUS_REQUEST_SENT   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("请求已发出。"));  
  break;  
  case   INTERNET_STATUS_RECEIVING_RESPONSE   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("等待服务器响应..."));  
  break;  
  case   INTERNET_STATUS_RESPONSE_RECEIVED   :  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("收到服务器的响应。"));  
  break;  
  #if   defined(   _DEBUG   )  
  case   INTERNET_STATUS_INTERMEDIATE_RESPONSE   :   //   一直未收到该消息  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   NULL);  
  break;  
  case   INTERNET_STATUS_REQUEST_COMPLETE   :   //   一直未收到该消息  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("请求已完成。"));  
  break;  
  // case   INTERNET_STATUS_STATE_CHANGE   :   //   此处未使用  
  // m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("状态被改变。"));  
  // break;  
  case   INTERNET_STATUS_CTL_RESPONSE_RECEIVED   :   //   not   implemented.  
  case   INTERNET_STATUS_PREFETCH   :   //   not   implemented.  
  default   :  
  break;  
  #endif  
  }  
  }  
   
  void   CALLBACK   CUpdateOnlineDlg::ICBConnect(HINTERNET   /*hInternet*/,   DWORD   dwContext,   DWORD   dwInternetStatus,  
    LPVOID   lpvStatusInformation,   DWORD   /*dwStatusInformationLength*/)  
  {  
  if(   !m_pThisDlg   )  
  return;  
   
  if(   dwContext   !=   CONTEXT_UPDATE_FILE   &&   dwContext   !=   CONTEXT_UPDATE_INFO   )  
  return;  
   
  LPINTERNET_ASYNC_RESULT         lpResult   =   (LPINTERNET_ASYNC_RESULT)lpvStatusInformation;  
   
  switch(   dwInternetStatus   )  
  {  
  // case   INTERNET_STATUS_REDIRECT   :   //   此处未使用  
  // m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("连接被重定向。"));  
  // break;  
  #if   defined(   _DEBUG   )  
  case   INTERNET_STATUS_HANDLE_CREATED   :  
  m_pThisDlg->GetDlgItem(   IDC_ADU_FILE_DESC   );  
  break;  
  case   INTERNET_STATUS_HANDLE_CLOSING   :  
  m_pThisDlg->GetDlgItem(   IDC_ADU_FILE_DESC   );  
  break;  
  case   INTERNET_STATUS_SENDING_REQUEST   :  
  m_pThisDlg->GetDlgItem(   IDC_ADU_FILE_DESC   );  
  break;  
  case   INTERNET_STATUS_REQUEST_SENT   :  
  m_pThisDlg->GetDlgItem(   IDC_ADU_FILE_DESC   );  
  break;  
  case   INTERNET_STATUS_RECEIVING_RESPONSE   :  
  m_pThisDlg->GetDlgItem(   IDC_ADU_FILE_DESC   );  
  break;  
  #endif  
  case   INTERNET_STATUS_RESPONSE_RECEIVED   :  
  // if(   dwContext   ==   CONTEXT_UPDATE_INFO   &&   lpResult->dwError   ==   128   )   //   此文件会很小,正常情况下能一次下载完  
  // {  
  // }  
  if(   dwContext   ==   CONTEXT_UPDATE_FILE   &&   lpResult->dwError   ==   128   )   //   128:   收到正下载的文件数据,且dwResult中为本次收到的字节数  
  {  
  ASSERT(   m_pThisDlg->m_dwFileSize   >   0   );  
  m_pThisDlg->m_dwDownloaded   +=   lpResult->dwResult;  
  if(   m_pThisDlg->m_dwFileSize   >   1048576   )  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_FILE_PROGRESS,   PBM_SETPOS,   m_pThisDlg->m_dwDownloaded/(m_pThisDlg->m_dwFileSize/100),   0L);  
  else  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_FILE_PROGRESS,   PBM_SETPOS,   m_pThisDlg->m_dwDownloaded*100/m_pThisDlg->m_dwFileSize,   0L);  
  }  
  break;  
  #if   defined(   _DEBUG   )  
  case   INTERNET_STATUS_INTERMEDIATE_RESPONSE   :   //   一直未收到此消息  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   NULL);  
  break;  
  case   INTERNET_STATUS_REQUEST_COMPLETE   :   //   一直未收到此消息  
  m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("请求已完成。"));  
  break;  
  // case   INTERNET_STATUS_STATE_CHANGE   :   //   此处未使用  
  // m_pThisDlg->SendDlgItemMessage(IDC_ADU_STATUS_TEXT,   WM_SETTEXT,   0,   (LPARAM)_T("状态被改变。"));  
  // break;  
  case   INTERNET_STATUS_CTL_RESPONSE_RECEIVED   :   //   not   implemented.  
  case   INTERNET_STATUS_PREFETCH   :   //   not   implemented.  
  default   :  
  break;  
  #endif  
  }  
  }  
   
  </pre>Top

3 楼jing()回复于 2000-02-13 13:07:00 得分 0

Thank   you   very   muchTop

4 楼jing()回复于 2000-03-09 10:03:00 得分 0

请问WHQ你的回调函数如何设。Top

相关问题

  • 怎么得到远程FTP上的指定目录下的所有文件名?
  • 如何指定目录?
  • 请问有什么好的FTP软件可以实现多用户访问FTP服务器指定的目录.
  • 如何实现ftp指定目录的下载、上传、删除?来者有分,大家救命啊!
  • 如何在VC中使用ZIP技术实现解压到指定目录并覆盖其中文件
  • 请问怎样进入指定目录
  • 如何用API复制指定目录?
  • 如何指定网站的根目录?
  • 遍历ftp目录
  • 怎么在指定的目录下查找指定的文件?

关键词

  • 下载
  • 函数
  • 服务器
  • idc
  • 连接
  • zip
  • internet
  • szmessage
  • pthisdlg
  • szftpsite

得分解答快速导航

  • 帖主:jing
  • radish
  • WHQ

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo