如何在程序中实现下载FTP,及判断下载状态,当下载完闭后将zip文件自动解压到指定目录。
最好有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




