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

📄 mainfrm.cpp

📁 这是主要完成文件上传功能,对要写ftp程序者是一个好的参考源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "EasyFtp.h"

#include "MainFrm.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame
#include "EasyFtpDoc.h"
#include "LocalView.h"
#include "WorkView.h"
#include "ProjectTree.h"
#include "WebView.h"
#include "MessageView.h"
#include "SettingBox.h"
#include "ProjectName.h"

#include "wininet.h"
#include "ras.h"


HICON m_hIcon;		//任务图标

int iPathNo=0;		//路径堆栈计数器
int iPathPoint=0;	//路径堆栈计指针
char sWebPathNeedSerch[1024][256];//路径堆栈
char sNowWebPath[256];

RECT rectMainWindowsRect;	//窗口大小

CMainFrame *pMainFrame;
extern CLocalView *pLocalView;
extern CWebView *pWebView;
extern CMessageView *pMessageView;
extern CWorkView *pWorkView;
extern CProjectTree *pProjectTree;
extern int iNowProjectNo;

int iIconNumber=0;			//图标编号
bool bLinkDataGood=false;	//数据传递情况好标志
bool bWebTry=false;			//服务重试状态
BOOL bAutoDial=false;		//自动拨号
BOOL bAutoHangUp=false;		//自动挂断
BOOL bCmpTime=false;		//比较时间
BOOL bAutoDialAgain=false;	//拨号失败继续重拨
BOOL bDialWhenHangUp=false;	//必要时候拨号
BOOL bWebAgain=false;		//服务器失败重试
BOOL bMUpThread=false;		//允许多个上传线程
BOOL bQuitWhenFinish=false;	//完成后退出
BOOL bShutDownWhenFinish=false;//完成后关闭计算机
BOOL bWebToLocal=true;		//直接比较记录文件
int iMThreadMax=3;			//服务器线程最大值
int iWebLoop=0;				//服务器失败重试次数
int iWebTryLoop=0;			//已用服务器失败重试次数
int iDialDelay=5;			//拨号失败延迟
int iDialLoop=0;			//拨号失败次数
volatile int iMThreadWorkTotal=0;	//任务个数
volatile int iMThreadWorkNowNo=0;	//当前已经分配的任务号码
volatile bool bMThreadWorkReady[5]=
{true,true,true,true,true};//线程空闲
char sDialNumber[256],sDialUser[256],sDialPassword[256];

//申明一个线程指针并建立一个线程函数主体
CWinThread *MyFtpLogoThread;             //代表辅助线程
CWinThread *MyFtpUpThread;				//上传线程
CWinThread *MyDialThread;
CWinThread *MyMUpThread[10];
UINT MyMUpThreadFunction(LPVOID lpParam);
//void MyMUpThreadEnd(void);
UINT MyDialThreadFunction(LPVOID lpParam);
///void MyDialThreadEnd(void);
UINT MyFtpLogoThreadFunction(LPVOID lpParam);
//void MyFtpLogoThreadEnd(void);
UINT MyFtpUpThreadFunction(LPVOID lpParam);
//void MyFtpUpThreadEnd(void);
bool Dial();
bool HangUp();
bool bAutoLoad=false;
bool bCmpNow=false;


CString csName,csUser,csPassword,csWebPath,csLocalPath;

int iTotalProject=0;		//项目个数
int iTotalWebFile=0;
int iTotalWebDir=0;
DWORD dwTotalWebFileLong=0;

volatile bool bExitApp=false;

char sProjectAttrib[256][6][256];
//项目名
//用户名
//地址
//密码
//服务器路径
//本地路径


IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_COMMAND(ID_CTL_BREAK, OnCtlBreak)
	ON_COMMAND(ID_BUTTON_EXIT, OnButtonExit)
	ON_COMMAND(ID_CTL_HUANGUP, OnCtlHuangup)
	ON_EN_CHANGE(IDC_FTPADD, OnChangeFtpadd)
	ON_EN_CHANGE(IDC_FTPUSER, OnChangeFtpuser)
	ON_EN_CHANGE(IDC_FTPPASSWORD, OnChangeFtppassword)
	ON_EN_CHANGE(IDC_LOCALPATH, OnChangeLocalpath)
	ON_EN_CHANGE(IDC_WEBPATH, OnChangeWebpath)
	ON_COMMAND(ID_CTL_FTPUP, OnCtlFtpup)
	ON_COMMAND(ID_CTL_DIAL, OnCtlDial)
	ON_COMMAND(ID_CTL_SETTING, OnCtlSetting)
	ON_COMMAND(ID_CTL_AUTOLOAD, OnCtlAutoload)
	ON_COMMAND(ID_CTL_CMP, OnCtlCmp)
	ON_COMMAND(ID_PROJECT_ADD, OnProjectAdd)
	ON_COMMAND(ID_PROJECT_DELETE, OnProjectDelete)
	ON_WM_TIMER()
	ON_COMMAND(ID_QUICK_WEBTOLOCAL, OnQuickWebtolocal)
	ON_UPDATE_COMMAND_UI(ID_QUICK_WEBTOLOCAL, OnUpdateQuickWebtolocal)
	ON_COMMAND(ID_QUICK_SHUTDOWN, OnQuickShutdown)
	ON_UPDATE_COMMAND_UI(ID_QUICK_SHUTDOWN, OnUpdateQuickShutdown)
	ON_COMMAND(ID_QUICK_QUITWHENFINISH, OnQuickQuitwhenfinish)
	ON_UPDATE_COMMAND_UI(ID_QUICK_QUITWHENFINISH, OnUpdateQuickQuitwhenfinish)
	ON_COMMAND(ID_QUICK_AUTODIAL, OnQuickAutodial)
	ON_UPDATE_COMMAND_UI(ID_QUICK_AUTODIAL, OnUpdateQuickAutodial)
	ON_COMMAND(ID_QUICK_HANGUP, OnQuickHangup)
	ON_UPDATE_COMMAND_UI(ID_QUICK_HANGUP, OnUpdateQuickHangup)
	ON_COMMAND(ID_QUICK_TIMECMP, OnQuickTimecmp)
	ON_UPDATE_COMMAND_UI(ID_QUICK_TIMECMP, OnUpdateQuickTimecmp)
	ON_EN_UPDATE(IDC_WEBPATH, OnUpdateWebpath)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MY_PROJECT_UPDATE,OnUpdateProject)
	ON_MESSAGE(WM_MY_AUTO_LOAD,OnAutoLoad)
	ON_MESSAGE(WM_MY_AUTO_LINK,OnAutoLink)
	ON_MESSAGE(WM_MY_WEBLOOP_LOGO,OnWebLogoLoop)
	ON_MESSAGE(WM_MY_WEBLOOP_UP,OnWebUpLoop)
	ON_MESSAGE(WM_MY_APP_EXIT,OnMyExit)
	ON_MESSAGE(WM_MY_SHUTDOWN,OnMyShutDown)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	MyDialThread=NULL;
	pMainFrame=this;
	iTotalProject=0;
	int iNo;
	int i,j,k;
	char ctemp;
	FILE *fo;
	bAutoDial=false;
	bAutoHangUp=false;
	bCmpTime=false;
	bAutoDialAgain=false;	//拨号失败继续重拨
	bDialWhenHangUp=false;	//必要时候拨号
	bMUpThread=false;		//允许多个上传线程
	bQuitWhenFinish=false;	//完成后退出
	bShutDownWhenFinish=false;//完成后关闭计算机
	bWebToLocal=true;		//直接比较记录文件
	iDialDelay=5;			//拨号失败延迟
	iDialLoop=0;			//拨号失败次数
	
	strcpy(sDialUser,"anybody");
	strcpy(sDialNumber,"999");
	strcpy(sDialPassword,"easyftp");
	fo=fopen("set.sys","rb");
	if(fo!=NULL)
	{
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bAutoDial=true;
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bAutoHangUp=true;
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bCmpTime=true;
		fscanf(fo,"%d",&iNo);
		fscanf(fo,"%c%c",&ctemp,&ctemp);
		for(i=0;i<iNo;i++)
		{
			fscanf(fo,"%c",&sDialNumber[i]);
		}
		sDialNumber[i]=0x00;
		fscanf(fo,"%d",&iNo);
		fscanf(fo,"%c%c",&ctemp,&ctemp);
		for(i=0;i<iNo;i++)
		{
			fscanf(fo,"%c",&sDialUser[i]);
		}
		sDialUser[i]=0x00;
		fscanf(fo,"%d",&iNo);
		fscanf(fo,"%c%c",&ctemp,&ctemp);
		for(i=0;i<iNo;i++)
		{
			fscanf(fo,"%c",&sDialPassword[i]);
		}
		sDialPassword[i]=0x00;
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bAutoDialAgain=true;	//拨号失败继续重拨
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bAutoDialAgain=true;	//拨号失败继续重拨
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bDialWhenHangUp=true;	//必要时候拨号
		fscanf(fo,"%d",&iDialDelay);//拨号失败延迟
		fscanf(fo,"%d",&iDialLoop);//拨号失败次数
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bWebAgain=true;		//服务器失败重试
		fscanf(fo,"%d",&iWebLoop);//服务器失败重试次数
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bMUpThread=true;		//允许多个上传线程
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bQuitWhenFinish=true;	//完成后退出
		fscanf(fo,"%d",&iNo);
		if(iNo==1)
			bShutDownWhenFinish=true;//完成后关闭计算机
		fscanf(fo,"%d",&iMThreadMax);//服务器线程最大值
		if(iMThreadMax<1||iMThreadMax>10)
			iMThreadMax=3;
		fscanf(fo,"%d",&iNo);
		if(iNo==0)
			bWebToLocal=false;		//直接比较记录文件
		fclose(fo);
	}
	fo=fopen("save.dat","rb");
	if(fo==NULL)
	{
		//AfxMessageBox("无法提取存盘");
		return;
	}
	fscanf(fo,"%d",&iTotalProject);
	if(iTotalProject<=0||iTotalProject>256)
	{
		iTotalProject=0;
		fclose(fo);
		return;
	}
	for(i=0;i<iTotalProject;i++)
	{
		for(k=0;k<6;k++)
		{
			fscanf(fo,"%d",&iNo);
			fscanf(fo,"%c%c",&ctemp,&ctemp);
			for(j=0;j<iNo;j++)
			{
				fscanf(fo,"%c",&sProjectAttrib[i][k][j]);
			}
			sProjectAttrib[i][k][j]=0x00;
		}
	}	
	fclose(fo);
}

CMainFrame::~CMainFrame() 
{
	//MyFtpLogoThreadEnd();
	pMainFrame=NULL;
	FILE *fo;
	int i,j;
	fo=fopen("set.sys","wb");
	if(fo!=NULL)
	{
		if(bAutoDial)
		{
			fprintf(fo,"1\r\n");
		}
		else
		{
			fprintf(fo,"0\r\n");
		}
		if(bAutoHangUp)
		{
			fprintf(fo,"1\r\n");
		}
		else
		{
			fprintf(fo,"0\r\n");
		}
		if(bCmpTime)
		{
			fprintf(fo,"1\r\n");
		}
		else
		{
			fprintf(fo,"0\r\n");
		}
		fprintf(fo,"%d\r\n",strlen(sDialNumber));
		fprintf(fo,"%s\r\n",sDialNumber);
		fprintf(fo,"%d\r\n",strlen(sDialUser));
		fprintf(fo,"%s\r\n",sDialUser);
		fprintf(fo,"%d\r\n",strlen(sDialPassword));
		fprintf(fo,"%s\r\n",sDialPassword);
		if(bAutoDialAgain)//拨号失败继续重拨
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		if(bAutoDialAgain)	//拨号失败继续重拨
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		if(bDialWhenHangUp)//必要时候拨号
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		fprintf(fo,"%d\r\n",iDialDelay);//拨号失败延迟
		fprintf(fo,"%d\r\n",iDialLoop);//拨号失败次数
		if(bWebAgain)//服务器失败重试
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		fprintf(fo,"%d\r\n",iWebLoop);//服务器失败重试次数
		if(bMUpThread)//允许多个上传线程
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		if(bQuitWhenFinish)//完成后退出
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		if(bShutDownWhenFinish)//完成后关闭计算机
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		fprintf(fo,"%d\r\n",iMThreadMax);//服务器线程最大值
		if(bWebToLocal)	//直接比较记录文件
			fprintf(fo,"1\r\n");
		else
			fprintf(fo,"0\r\n");
		fclose(fo);
	}
	fo=fopen("save.dat","wb");
	if(fo==NULL)
	{
		AfxMessageBox("无法存盘");
		return;
	}
	fprintf(fo,"%d\r\n",iTotalProject);
	for(i=0;i<iTotalProject;i++)
	{
		for(j=0;j<6;j++)
		{
			fprintf(fo,"%d\r\n",strlen(sProjectAttrib[i][j]));
			fprintf(fo,"%s\r\n",sProjectAttrib[i][j]);
		}
	}
	fclose(fo);
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
//	m_wndToolBar.SetButtonStyle(1,TBBS_CHECKBOX);
//	m_wndToolBar.SetHeight(50);
//	m_wndToolBar.SetButtonText(1,"CKBOX");
	//设置为复选模式
	if (!m_wndDlgBar.Create(this, IDR_MAINFRAME, 
		CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
	{
		TRACE0("Failed to create dialogbar\n");
		return -1;		// fail to create
	}

	if (!m_wndReBar.Create(this) ||
		!m_wndReBar.AddBar(&m_wndToolBar) ||
		!m_wndReBar.AddBar(&m_wndDlgBar))
	{
		TRACE0("Failed to create rebar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Remove this if you don't want tool tips
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY);

	//*****************任务栏显示图标
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	NOTIFYICONDATA tnid; 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = GetSafeHwnd();
    tnid.uID = WM_SCNOTIFYICON; 
    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = WM_SCNOTIFYICON; 
	tnid.hIcon = m_hIcon; 
    memset(tnid.szTip, 0, 32);
	lstrcpy(tnid.szTip, "EasyFtp㊣");//显示浮动提示
    Shell_NotifyIcon(NIM_ADD, &tnid);
	//-----------------------------
	SetTimer(101,500,NULL);		//设置定时器101,用于更新图标
	return 0;
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{
/*	return m_wndSplitter.Create(this,
		2, 2,               // TODO: adjust the number of rows, columns
		CSize(10, 10),      // TODO: adjust the minimum pane size
		pContext);*/
	ShowWindow(SW_SHOWMAXIMIZED);
	GetClientRect(&rectMainWindowsRect);
	//得到客户区域窗口大小
	if(!m_wndSplitter1.CreateStatic(this,3,1))
		return FALSE;		//建立3行
	m_wndSplitter1.SetRowInfo(0,rectMainWindowsRect.bottom*3/10,0);
	if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,0))==NULL)
		return FALSE;		//在第1行中建立2列
	if(!m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CProjectTree),CSize(rectMainWindowsRect.right*1/3,rectMainWindowsRect.bottom*3/10),pContext)||
		!m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CWorkView),CSize(rectMainWindowsRect.right*2/3,rectMainWindowsRect.bottom*3/10),pContext))
		return FALSE;		//设置第1行中2列
	m_wndSplitter1.SetRowInfo(1,rectMainWindowsRect.bottom*3/10,0);
	if(m_wndSplitter3.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(1,0))==NULL)
		return FALSE;		//在第2行中建立2列
	if(!m_wndSplitter3.CreateView(0,0,RUNTIME_CLASS(CLocalView),CSize(rectMainWindowsRect.right*1/2,rectMainWindowsRect.bottom*3/10),pContext)||
		!m_wndSplitter3.CreateView(0,1,RUNTIME_CLASS(CWebView),CSize(rectMainWindowsRect.right*1/2,rectMainWindowsRect.bottom*3/10),pContext))
		return FALSE;		//设置第2行中2列
	if(!m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CMessageView),
		CSize(rectMainWindowsRect.right,rectMainWindowsRect.bottom*4/10),pContext))
		return FALSE;		//设置第三行
	return TRUE;
	
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
		| WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnButton1() 
{
	// TODO: Add your control notification handler code here
	int i;
	char temp[256];
	bLinkDataGood=false;
	bExitApp=false;
	iWebTryLoop=0;
	m_wndDlgBar.GetDlgItemText(IDC_FTPADD,csName);
	m_wndDlgBar.GetDlgItemText(IDC_FTPUSER,csUser);
	m_wndDlgBar.GetDlgItemText(IDC_FTPPASSWORD,csPassword);
	m_wndDlgBar.GetDlgItemText(IDC_WEBPATH,csWebPath);
	strcpy(temp,csWebPath);
	if(temp[0]=='\\'||temp[0]=='/')
	{
		for(i=0;i<255;i++)
		{
			temp[i]=temp[i+1];
		}

⌨️ 快捷键说明

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