我目前正在使用MFC进行FTP下载。是一个非常简单的程序,它从用户输入2个输入并单击下载按钮,以便从服务器下载。一切都很好,我可以从中下载。但我意识到这个程序只能执行一次。成功或失败的用户必须再次打开.exe以下载另一个文件。我是C& 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();
}
我试图在网上搜索,我找不到任何接近的东西。对不起,我的解释很糟糕。
提前感谢您的回复
答案 0 :(得分:0)
以下是您需要做的事情:
CInternetSession m_Session;
成为CWinApp
派生类的成员。m_Session.Close()
派生类的ExitInstance()
方法中调用CWinApp
。CDialog
派生的课程中,您只应处理CFtpConnection
相关内容。因此,当用户点击下载按钮时,您应该致电GetFtpConnection()
并初始化m_pFtpConnection
并完成剩下的工作。下载/上传完成后,请致电m_pFtpConnection->Close();
和delete m_pFtpConnection;
CString
代替char*
。有很多好处,比如自动UNICODE支持等。CString::Format()
方法代替sprintf()
。您还应该考虑使用线程在单独的工作线程中执行上载/下载任务。使用AfxBeginThread()
启动该线程。这样,您不会影响作为主应用程序(GUI)线程一部分的Windows消息泵。因此,在上传/下载文件时,您的GUI不会锁定。