⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 这是主要完成文件上传功能,对要写ftp程序者是一个好的参考源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CFrameWnd::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	CString te;
	m_wndDlgBar.GetDlgItemText(IDC_WEBPATH,te);
	strcpy(sProjectAttrib[iNowProjectNo][4],te);
	// TODO: Add your control notification handler code here
}



UINT MyFtpUpThreadFunction(LPVOID lpParam)//char *cPath, char *cBasePath)
{
	int iTotal;
	CString csMessage;
	int i,iError=0;
	char temp1[256],temp2[256],temp[256],*ptemp;
	if(!bMUpThread)//非多线程模式
	{
		HINTERNET hInetSession;
		HINTERNET hFtpConn;
		bLinkDataGood=false;
		bWebTry=false;		//无需服务器重试
		iTotal=pWorkView->m_WorkList.GetItemCount();
		if(iTotal<=0)
		{
			if(bAutoLoad)
			{
				if(bAutoHangUp)
				{
					HangUp();
				}
				bAutoLoad=false;
			}
			//MyFtpUpThreadEnd();
			return 0;
		}
		bWebTry=true;		//允许服务器重试
		hInetSession=InternetOpen("EasyFtp-UpData",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
		csMessage="正在连接->";
		csMessage+=csName;
		csMessage+="服务器\r\n";
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
		hFtpConn=InternetConnect(hInetSession,csName,21,
			csUser,csPassword,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
		if(!hFtpConn)
		{
			csMessage=csName;
			csMessage+="服务器未接上\r\n";
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
			InternetCloseHandle(hInetSession);
			::Sleep(10);
			//MyFtpUpThreadEnd();
			return 0;
		}
		csMessage=csUser;
		csMessage+="已经成功登录";
		csMessage+=csName;
		csMessage+="服务器\r\n";
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
		bLinkDataGood=true;
		::Sleep(1000);
		for(i=0;i<iTotal;i++)
		{
			strcpy(temp1,csLocalPath);
			strcat(temp1,"\\");
			strcat(temp1,pWorkView->m_WorkList.GetItemText(i,3));
			strcat(temp1,pWorkView->m_WorkList.GetItemText(i,0));
			///AfxMessageBox(temp1);
			strcpy(temp2,"/");
			strcat(temp2,csWebPath);
			if(strcmp(temp2,"/")==0)
			{
			}
			else
			{
				strcat(temp2,"/");
			}
			strcat(temp2,pWorkView->m_WorkList.GetItemText(i,3));
			strcat(temp2,pWorkView->m_WorkList.GetItemText(i,0));
			for(unsigned int j=0;j<(strlen(temp2)+1);j++)
			{
				if(temp2[j]=='\\')
				{
					temp2[j]='/';
				}
			}
			strcpy(temp,strlwr(temp1));
			strcpy(temp1,temp);
			//强制小写
			strcpy(temp,strlwr(temp2));
			strcpy(temp2,temp);
			//强制小写
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"正在发送文件:");
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp1);
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"->");
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp2);
			//AfxMessageBox(temp2);
putfileagain:
			bLinkDataGood=true;
			if(FtpPutFile(hFtpConn,temp1,temp2,INTERNET_FLAG_TRANSFER_BINARY ,0))
			{
				pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"--OK\r\n");
				pWorkView->m_WorkList.SetItemText(i,5,"完成");
			}
			else
			{
				if(GetLastError()==12003)//路径非法
				{
					strcpy(temp,temp2);
					ptemp=strrchr(temp,'/');
					if(ptemp)
					{
						temp[strlen(temp)-strlen(ptemp)]=0x00;
						if(FtpCreateDirectory(hFtpConn,temp))
							goto putfileagain;
						//建立目录
					}
					
				}
				else//不是目录问题
				{		//失败重试
					if((iError++)<iWebTryLoop)
					{
						pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n重试  ");
						goto putfileagain;
					}
				}
				bLinkDataGood=false;
				pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"--失败\r\n");
				pWorkView->m_WorkList.SetItemText(i,5,"失败");
			}
		}
		bLinkDataGood=false;
		InternetCloseHandle(hFtpConn);
		////////////////////////////////
		InternetCloseHandle(hInetSession);//关闭连接
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"连接已经关闭\r\n");
		bWebTry=false;
		iTotal=pWorkView->m_WorkList.GetItemCount();
		if(bWebAgain&&iTotal>0)//错误重试
		{
			for(i=0;i<iTotal;i++)
			{
				strcpy(temp,pWorkView->m_WorkList.GetItemText(i,5));
				if(strcmp("完成",temp)!=0)
				{
					bWebTry=true;
				}
				else//将完成的去掉
				{
					pWorkView->m_WorkList.DeleteItem(i);
					iTotal-=1;
					i-=1;
				}
			}
		}
		if(bWebTry)//需要重试
		{
			//MyFtpUpThreadEnd();
			return 0;
		}
		bLinkDataGood=false;
		if(bAutoHangUp)
		{
			HangUp();
		}
		bAutoLoad=false;
		bWebTry=false;		//无需服务器重试
//		MyFtpUpThreadEnd();
		return 1;
	}//普通模式
	else//多线程模式*******************!!!!!!!!!!!!!
	{
		iMThreadWorkTotal=pWorkView->m_WorkList.GetItemCount();
		//得到工作任务个数
		bLinkDataGood=false;
		if(bAutoDial&&(iMThreadWorkTotal>0))
			//如果是自动拨号模式且有任务
		{
			if(!Dial())//拨号失败循环
			{
				int i;
				if(bAutoDialAgain)//失败重拨模式
				{
					for(i=0;i<iDialLoop;i++)
					{
						HangUp();
						csMessage.Format("\r\n拨号失败,延迟%d秒后进行第%d次(共%d次)重试\r\n",iDialDelay,i+1,iDialLoop);
						pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
						::Sleep(iDialDelay*1000);
						if(Dial())
							break;
						if(bExitApp)
							break;
					}
					if(i>=iDialLoop)//拨号已满
					{
						bAutoLoad=false;//关闭自动模式
						pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号失败");
						return 0;//关闭退出线程
					}
				}
				else
				{
					bAutoLoad=false;//关闭自动模式
					pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号失败");
					return 0;//关闭退出线程
				}
			}//拨号成功
		}//拨号处理完成
		for(i=0;i<5;i++)
		{
			bMThreadWorkReady[i]=true;//初始化线程空闲
		}
		iMThreadWorkNowNo=0;	//当前已经分配的任务号码
		if(iMThreadWorkTotal<=0)//没有更多的任务
		{
			bLinkDataGood=false;
			//完成任务后回填********************
			pWebView->PostMessage(WM_MY_WEB_TOLOCAL,0,(LPARAM)-1);
			//****************************
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n上传完成\r\n");
			if(bAutoHangUp)//需要自动挂断
			{
				HangUp();
			}
			::Sleep(iDialDelay*1000);//等待回填工作

			if(bShutDownWhenFinish)//完成后关闭计算机
			{
				pMainFrame->PostMessage(WM_MY_SHUTDOWN);
			}
			if(bQuitWhenFinish)	//完成后退出
			{
				pMainFrame->PostMessage(WM_MY_APP_EXIT);
			}
			return 0;
		}
		//有任务需要完成
		for(i=0;i<iMThreadMax;i++)
		{
			if(bMThreadWorkReady[i]&&(iMThreadWorkNowNo<iMThreadWorkTotal))
			//有任务,且工作线程有空
			{
				bMThreadWorkReady[i]=false;//填写线程忙标志
				//开始工作,并传递工作号码和线程号码(预留10个)
				if((MyMUpThread[i] = AfxBeginThread(MyMUpThreadFunction,(LPVOID)((iMThreadWorkNowNo++)*10+i))) == NULL)
				{
					AfxMessageBox("线程失败处理");
					//建立失败处理
					return 0;
				}
				else    //函数建立一个辅助线程并暂时将其挂起。
				{
					MyMUpThread[i]->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
					MyMUpThread[i]->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
				}
			}
		}
		return 1;
	}
}


void CMainFrame::OnCtlFtpup() 
{
	// TODO: Add your command handler code here
	iWebTryLoop=0;
	bExitApp=false;
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n准备上传\r\n");
	if((MyFtpUpThread = AfxBeginThread(MyFtpUpThreadFunction,this)) == NULL)
	{
		//建立失败处理
		return;
	}
	else    //函数会建立一个辅助线程并暂时将其挂起。
	{
		MyFtpUpThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
		MyFtpUpThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
	}
}

void CMainFrame::OnCtlDial() 
{
	// TODO: Add your command handler code here
	if((MyDialThread = AfxBeginThread(MyDialThreadFunction,0)) == NULL)
	{
		//建立失败处理
		return ;
	}
	else    //函数会建立一个辅助线程并暂时将其挂起。
	{
		MyDialThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
		MyDialThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
	}
}

bool Dial()
{
	CString csMessage;
	DWORD dwLength=MAX_PATH;
	RASCONN ras[20];
	DWORD  dSize, dNumber;
	char  szBuf[256];
	ras[0].dwSize = sizeof( RASCONN );
	dSize = sizeof( ras );   // Get active RAS - Connection
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"诊测网络状态...");
	DWORD  dwRet = RasEnumConnections( ras, &dSize, &dNumber );
	if ( dwRet != 0 )
	{
		if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
			wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
		csMessage=szBuf;
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
		return false;
	}//列举在线的连接
	if(dNumber==0)
	{
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"不存在\r\n正在进行拨号连接...");
		RASDIALPARAMS rdParams;			//申明参数变量
		rdParams.dwSize = sizeof(RASDIALPARAMS);
		rdParams.szEntryName[0] = '\0';
		lstrcpy( rdParams.szPhoneNumber, sDialNumber);//填写电话号码
		rdParams.szCallbackNumber[0] = '\0';
		lstrcpy( rdParams.szUserName, sDialUser);//填写用户名
		lstrcpy( rdParams.szPassword, sDialPassword);//填写密码号码
		rdParams.szDomain[0] = '\0';
		HRASCONN hRasConn = NULL;
		DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn );
		if ( dwRet == 0 )
		{
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"建立拨号网络成功\r\n");
		}	//连接成功
		else
		{
			if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
				wsprintf( (LPSTR)szBuf, "连接时发生未知的错误(%ld).", dwRet );
			RasHangUp( hRasConn );
			//MessageBox( (LPSTR)szBuf, "错误", MB_OK | MB_ICONSTOP );
			csMessage=szBuf;
			csMessage+="\r\n";
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
			return false;
		}
		
	}
	else
	{
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"已经存在\r\n");
		return true;
	}
	return true;
}

bool HangUp()
{
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"准备挂断拨号连接");
	//bExitApp=true;
	//MyFtpLogoThreadEnd();
	RASCONN ras[20];
	DWORD  dSize, dNumber,dwRet;
	char  szBuf[256];
	ras[0].dwSize = sizeof( RASCONN );
	dSize = sizeof( ras );   // Get active RAS - Connection
	dwRet = RasEnumConnections( ras, &dSize, &dNumber );
	if ( dwRet != 0 )
	{
		if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
			wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)szBuf);
		return false;
	}//列举在线的连接
	if(dNumber==0)
	{
		pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号连接不存在");
		return false;
	}
	for( DWORD dCount = 0;  dCount < dNumber;  dCount++ )
	{    // Hang up that connection
		HRASCONN hRasConn = ras[dCount].hrasconn;
		DWORD dwRet = RasHangUp( hRasConn );
		if ( dwRet != 0 )
		{
			char  szBuf[256];
			if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
				wsprintf( (LPSTR)szBuf, "挂断时发生未知的错误(%ld).", dwRet );
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)szBuf);
			return false;
		}
	}//挂断所有连接
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"拨号连接已经挂断");
	return true;
}


void CMainFrame::OnCtlSetting() 
{
	// TODO: Add your command handler code here
	CSettingBox setbox;
	setbox.m_AutoDial=bAutoDial;
	setbox.m_AutoHangUp=bAutoHangUp;
	setbox.m_DialAgain=bAutoDialAgain;//拨号失败继续重拨
	setbox.m_DialWhenHangUp=bDialWhenHangUp;//必要时候拨号
	setbox.m_DialLoop=iDialLoop;			//拨号失败次数
	setbox.m_DialDelay=iDialDelay;			//拨号失败延迟
	setbox.m_WebAgain=bWebAgain;		//服务器失败重试
	setbox.m_WebLoop=iWebLoop;				//服务器失败重试次数
	setbox.m_MUpThread=bMUpThread;		//允许多个上传线程
	setbox.m_MThreadNo=iMThreadMax;//服务器线程最大值
	setbox.m_WebToLocal=bWebToLocal;	//直接记录比较
	setbox.m_AutoQuit=bQuitWhenFinish;
	setbox.m_AutoShutDown=bShutDownWhenFinish;
	setbox.m_CmpTime=bCmpTime;
	setbox.m_Number.Format("%s",sDialNumber);
	setbox.m_User.Format("%s",sDialUser);
	setbox.m_Passwrod.Format("%s",sDialPassword);
	if(setbox.DoModal()==IDOK)
	{
		bAutoDial=setbox.m_AutoDial;
		bAutoHangUp=setbox.m_AutoHangUp;
		bCmpTime=setbox.m_CmpTime;
		strcpy(sDialNumber,setbox.m_Number);
		strcpy(sDialUser,setbox.m_User);
		strcpy(sDialPassword,setbox.m_Passwrod);
		bAutoDialAgain=setbox.m_DialAgain;//拨号失败继续重拨
		bDialWhenHangUp=setbox.m_DialWhenHangUp;//必要时候拨号
		iDialLoop=setbox.m_DialLoop;			//拨号失败次数
		iDialDelay=setbox.m_DialDelay;			//拨号失败延迟
		bWebAgain=setbox.m_WebAgain;		//服务器失败重试
		iWebLoop=setbox.m_WebLoop;			//服务器失败重试次数
		bMUpThread=setbox.m_MUpThread;		//允许多个上传线程
		iMThreadMax=setbox.m_MThreadNo;//服务器线程最大值
		bWebToLocal=setbox.m_WebToLocal;	//直接记录比较
		bQuitWhenFinish=setbox.m_AutoQuit;
		bShutDownWhenFinish=setbox.m_AutoShutDown;
	}
}

void CMainFrame::OnCtlAutoload() 
{
	// TODO: Add your command handler code here
	iWebTryLoop=0;
	bAutoLoad=true;
	bCmpNow=false;
	pLocalView->PostMessage(WM_MY_PROJECT_PATH,0,(LPARAM)sProjectAttrib[iNowProjectNo][5]);
	//OnButton1();
}

void CMainFrame::OnAutoLoad(WPARAM wParam, LPARAM lParam)
{
	bExitApp=false;
	OnCtlFtpup();
}

void CMainFrame::OnAutoLink(WPARAM wParam, LPARAM lParam)
{
	OnButton1();
}

void CMainFrame::OnCtlCmp() 
{
	// TODO: Add your command handler code here
	bAutoLoad=false;
	bCmpNow=true;
	pLocalView->PostMessage(WM_MY_PROJECT_PATH,0,(LPARAM)sProjectAttrib[iNowProjectNo][5]);	
}


UINT MyDialThreadFunction(LPVOID lpParam)
{
	CString csMessage;
	int i;
	if((!Dial())&&bAutoDialAgain)
	{
		for(i=0;i<iDialLoop;i++)
		{
			HangUp();
			csMessage.Format("\r\n拨号失败,延迟%d秒后进行第%d次(共%d次)重试\r\n",iDialDelay,i+1,iDialLoop);
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)csMessage);
			::Sleep(iDialDelay*1000);
			if(Dial())
				break;
			if(bExitApp)
				break;
		}
		if(i>=iDialLoop)
			pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n拨号失败\r\n");
		else//拨号成功
		{
			if(bAutoLoad)
			{
				pMainFrame->PostMessage(WM_MY_WEBLOOP_LOGO);
			}
		}
	}
	return 0;//关闭退出线程
}

void CMainFrame::OnProjectAdd() 
{
	// TODO: Add your command handler code here
	CProjectName NameBox;
	NameBox.m_Name.Format("新建项目编号%02d",iTotalProject+1);
	NameBox.m_WebAdd="ftp.your.com";
	NameBox.m_WebPath="";
	NameBox.m_User="webmastername";
	NameBox.m_Passwrod="12345678";
	NameBox.m_LocalPath="c:\\temp";
	if(NameBox.DoModal()==IDOK)
	{
		iNowProjectNo=iTotalProject++;
		strcpy(sProjectAttrib[iNowProjectNo][0],NameBox.m_Name);
		strcpy(sProjectAttrib[iNowProjectNo][1],NameBox.m_User);
		strcpy(sProjectAttrib[iNowProjectNo][2],NameBox.m_WebAdd);
		strcpy(sProjectAttrib[iNowProjectNo][3],NameBox.m_Passwrod);
		strcpy(sProjectAttrib[iNowProjectNo][4],NameBox.m_WebPath);
		strcpy(sProjectAttrib[iNowProjectNo][5],NameBox.m_LocalPath);
//		m_wndDlgBar.SetDlgItemText(IDC_FTPADD,sProjectAttrib[iNowProjectNo][2]);
//		m_wndDlgBar.SetDlgItemText(IDC_FTPUSER,sProjectAttrib[iNowProjectNo][1]);
//		m_wndDlgBar.SetDlgItemText(IDC_FTPPASSWORD,sProjectAttrib[iNowProjectNo][3]);
//		m_wndDlgBar.SetDlgItemText(IDC_WEBPATH,sProjectAttrib[iNowProjectNo][4]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -