我目前正在使用MFC做FTP下载。是一个非常简单的程序,需要从用户2个输入,并单击下载按钮,以便从服务器下载。一切正常,我可以从。但我意识到这个程序只能执行一次。无论是成功还是失败,用户都必须再次打开.exe下载另一个文件。我是c++初学者,有一个简单的知识,我把OnInitDialog()放在下载函数跳转的最后一行,它将循环回来并再次初始化。当然这行不通。下面是我当前下载按钮的代码
BOOL CFTPDOWNLOADDlg::Log_In(char* path, char* ID, char* password {
m_pFtpConnection = NULL;
try{
// path
// ID
// password
m_pFtpConnection = m_Session.GetFtpConnection(path,
ID,password,INTERNET_INVALID_PORT_NUMBER);
}
catch(CInternetException *pEx){
pEx->ReportError(MB_ICONEXCLAMATION);
m_pFtpConnection = NULL;
pEx->Delete();
return FALSE;
}
return TRUE;
}
BOOL CFTPDOWNLOADDlg::Download(){
m_Edit3.SetWindowText("Downloading..");
m_Session.EnableStatusCallback(TRUE);
if(m_pFtpConnection->GetFile(serv_Loc,host_Loc,
FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY,1) != 0){
MessageBox("Download Complete");
m_Edit3.SetWindowText("");}
else{
MessageBox("Download Fail");
return FALSE;
}
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL) delete m_pFtpConnection;
else MessageBox("Download Complete");
return TRUE;
}
BOOL CFTPDOWNLOADDlg::get_Path(){
...
...
...
sprintf(serv_Loc,"soft\%s\%d\%s.zip",s_No,r_Number,r_No);
sprintf(host_Loc,"%s\%s.zip",buff2,r_No);
return TRUE;
}
void CFTPDOWNLOADDlg::OnCancel() {
// Log_out Session
m_Session.Close();
m_pFtpConnection->Close();
if(m_pFtpConnection!=NULL)
delete m_pFtpConnection;
CDialog::OnCancel();
}
void CFTPDOWNLOADDlg::OnDLButton() {
//get path from user input
get_Path();
// start download
Download();
}
我试着在网上搜索,我找不到任何接近的。对不起,我解释得不好。
提前感谢您的回信
你需要做的是:
- 应该让
CInternetSession m_Session;
成为CWinApp
派生类的成员。 - 你应该在
CWinApp
派生类的ExitInstance()
方法中调用m_Session.Close()
。 - 在你的
CDialog
派生类中,你应该只处理CFtpConnection
相关的东西。因此,当用户单击Download按钮时,您应该调用GetFtpConnection()
并初始化m_pFtpConnection
并完成其余工作。下载/上传完成后,调用m_pFtpConnection->Close();
和delete m_pFtpConnection;
- 请使用
CString
代替char*
。有很多好处,如自动UNICODE支持等。 - 请考虑使用
CString::Format()
方法代替sprintf()
方法。
你还应该考虑在单独的工作线程中使用线程来执行上传/下载任务。使用AfxBeginThread()
启动线程。这样就不会影响Windows消息泵,它是主应用程序(GUI)线程的一部分。所以当你上传/下载文件时,你的GUI不会被锁住。