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

jing 2000-01-30 01:40:00
最好有sdk or mfc or vb的SOURCE CODE
...全文
561 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jing 2000-03-09
  • 打赏
  • 举报
回复
请问WHQ你的回调函数如何设。
jing 2000-02-13
  • 打赏
  • 举报
回复
Thank you very much
WHQ 2000-01-30
  • 打赏
  • 举报
回复
<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>
radish 2000-01-30
  • 打赏
  • 举报
回复
下载例子到http://codeguru.developer.com/index.shtml,调用ZIP可以用SHELLEXECUTE调用

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧