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

📄 mainwin.cpp

📁 FastCopy 利用缓冲技术加快文件拷贝
💻 CPP
📖 第 1 页 / 共 4 页
字号:

		if (ret) {
			SetDlgItemText(IsListing() ? LIST_BUTTON : IDOK, GetLoadStr(IDS_CANCEL));
			RefreshWindow(TRUE);
		}
	}
	if (!ret && pathLogBuf) {
		delete [] pathLogBuf;
		pathLogBuf = NULL;
	}
	return	ret;
}

BOOL TMainDlg::ExecCopyCore(void)
{
	::GetLocalTime(&startTm);
	BOOL ret = fastCopy.Start();
	if (ret) {
		RefreshWindow();
		timerCnt = 0;
		::GetCursorPos(&curPt);
		::SetTimer(hWnd, FASTCOPY_TIMER, 500, NULL);
	}
	return	ret;
}

BOOL TMainDlg::EndCopy(void)
{
	char	buf[1024];

	::KillTimer(hWnd, FASTCOPY_TIMER);

	BOOL	is_starting = fastCopy.IsStarting();

	if (is_starting) {
		SetInfo(FALSE, TRUE);

		if (isErrLog && !IsListing()) {
			EnableLogFile(TRUE);
			::SetFilePointer(hErrLogFile, 0, 0, FILE_END);

			DWORD len = sprintf(buf, "-------------------------------------------------\r\n"
				"FastCopy(%s) start at %d/%02d/%02d %02d:%02d:%02d\r\n\r\n",
				GetVersionStr(),
				startTm.wYear, startTm.wMonth, startTm.wDay,
				startTm.wHour, startTm.wMinute, startTm.wSecond);
			::WriteFile(hErrLogFile, buf, len, &len, 0);
			::WriteFile(hErrLogFile, pathLogBuf, strlen(pathLogBuf), &len, 0);

			if (errBufOffset) {
				::WriteFile(hErrLogFile, ti.errBuf->Buf(), errBufOffset, &len, 0);
				len = sprintf(buf, "%s", "\r\n\r\n");
				::WriteFile(hErrLogFile, buf, len, &len, 0);
			}
			else {
				char	msg[] = " No Errors\r\n\r\n";
				::WriteFile(hErrLogFile, msg, sizeof(msg) -1, &len, 0);
			}

			len = GetDlgItemText(STATUS_EDIT, buf, sizeof(buf));
			len += sprintf(buf + len, "%s", "\r\n\r\nResult : ");
			len += GetDlgItemText(ERRSTATUS_STATIC, buf + len, sizeof(buf) - len);
			len += sprintf(buf + len, "%s", "\r\n\r\n");
			::WriteFile(hErrLogFile, buf, len, &len, 0);

			EnableLogFile(FALSE);
		}
		::EnableWindow(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK), FALSE);
		fastCopy.End();
		::EnableWindow(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK), TRUE);
	}
	else
		SendDlgItemMessage(STATUS_EDIT, WM_SETTEXT, 0, (LPARAM)" ---- Canceled. ----");

	delete [] pathLogBuf;
	pathLogBuf = NULL;
	endTick = ::GetTickCount();

	SetDlgItemText(IsListing() ? LIST_BUTTON : IDOK, GetLoadStr(IsListing() ? IDS_LISTING : IDS_EXECUTE));
	SetDlgItemText(SAMEDRV_STATIC, "");
	if (autoCloseLevel == FORCE_CLOSE || autoCloseLevel == NOERR_CLOSE && (!is_starting || (ti.total.errFiles == 0 && ti.total.errDirs == 0)))
		PostMessage(WM_CLOSE, 0, 0);
	autoCloseLevel = NO_CLOSE;
	RefreshWindow(TRUE);
	UpdateMenu();

	SetFocus(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK));

	if (isTaskTray)
		TaskTray(NIM_MODIFY, hMainIcon[curIconIndex = FCNORMAL_ICON_INDEX], FASTCOPY);

	return	TRUE;
}

BOOL TMainDlg::EventUser(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_FASTCOPY_MSG:
		if (wParam == FastCopy::END_NOTIFY) {
			EndCopy();
		}
		else if (wParam == FastCopy::CONFIRM_NOTIFY) {
			FastCopy::Confirm	*confirm = (FastCopy::Confirm *)lParam;
			switch (TConfirmDlg().Exec(confirm->message, confirm->allow_continue, this)) {
			case IDIGNORE:	confirm->result = FastCopy::Confirm::IGNORE_RESULT;		break;
			case IDCANCEL:	confirm->result = FastCopy::Confirm::CANCEL_RESULT;		break;
			default:		confirm->result = FastCopy::Confirm::CONTINUE_RESULT;	break;
			}
		}
		return	TRUE;

	case WM_FASTCOPY_NOTIFY:
		switch (lParam) {
		case WM_LBUTTONDOWN: case WM_RBUTTONDOWN:
			SetForceForegroundWindow();
			Show();
			break;

		case WM_LBUTTONUP: case WM_RBUTTONUP:
			Show();
			if (isErrEditHide && ti.errBuf && ti.errBuf->UsedSize())
				SetNormalWindow();
			TaskTray(NIM_DELETE);
			break;
		}
		return	TRUE;

	case WM_FASTCOPY_HIDDEN:
		Show(SW_HIDE);
		TaskTray(NIM_ADD, hMainIcon[isDelay ? FCWAIT_ICON_INDEX : FCNORMAL_ICON_INDEX], FASTCOPY);
		return	TRUE;

	default:
		if (uMsg == TaskBarCreateMsg)
		{
			if (isTaskTray)
				TaskTray(NIM_ADD, hMainIcon[isDelay ? FCWAIT_ICON_INDEX : FCNORMAL_ICON_INDEX], FASTCOPY);
			return	TRUE;
		}
	}
	return	FALSE;
}

BOOL TMainDlg::EvTimer(WPARAM timerID, TIMERPROC proc)
{
	timerCnt++;

	if (isDelay) {
		if (fastCopy.TakeExclusivePriv()) {
			::KillTimer(hWnd, FASTCOPY_TIMER);
			isDelay = FALSE;
			ExecCopyCore();
		}
	}
	else {
		DWORD	waitCnt = fastCopy.GetAutoSlow();
		if (isAutoSlow) {
			POINT	pt;
			::GetCursorPos(&pt);
			HWND	foreWnd = ::GetForegroundWindow();

			if (foreWnd == hWnd) {
				waitCnt = 0;
			}
			else if (pt.x != curPt.x || pt.y != curPt.y || foreWnd != curForeWnd) {
				curPt = pt;
				curForeWnd = foreWnd;
				waitCnt = cfg.autoSlow;
			}
			else if (waitCnt > 0 && timerCnt % 2) {
				waitCnt -= 1;
			}
			fastCopy.SetAutoSlow(waitCnt);
		}
		else if (waitCnt) {
			fastCopy.SetAutoSlow(0);
		}

		if (timerCnt % 2)
			SetInfo(isTaskTray);
	}

	return	TRUE;
}

BOOL TMainDlg::EnableLogFile(BOOL on)
{
	if (on && hErrLogFile == INVALID_HANDLE_VALUE) {
		hErrLogMutex = ::CreateMutex(NULL, TRUE, FASTCOPYLOG_MUTEX);
		hErrLogFile = ::CreateFileV(cfg.logPath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0);
	}
	else if (!on && hErrLogFile != INVALID_HANDLE_VALUE) {
		::CloseHandle(hErrLogFile);
		hErrLogFile = INVALID_HANDLE_VALUE;

		::CloseHandle(hErrLogMutex);
		hErrLogMutex = NULL;
	}
	return	TRUE;
}

int GetArgOpt(void *arg, int default_value)
{
	if (GetChar(arg, 0) == '=') {
		arg = MakeAddr(arg, 1);
	}

	if (GetChar(arg, 0) == 0) {
		return	default_value;
	}

	if (lstrcmpiV(arg, TRUE_V) == 0)
		return	TRUE;

	if (lstrcmpiV(arg, FALSE_V) == 0)
		return	FALSE;

	if (GetChar(arg, 0) >= '0' && GetChar(arg, 0) <= '9')
		return	GetChar(arg, 0) - '0';

	return	default_value;
}

int CmdNameToComboIndex(void *cmd_name)
{
	for (int i=0; COPYINFO_LIST[i].cmdline_name; i++) {
		if (lstrcmpiV(cmd_name, COPYINFO_LIST[i].cmdline_name) == 0)
			return	i;
	}
	return	-1;
}

BOOL TMainDlg::CommandLineExecV(int argc, void **argv)
{
	VBuf	shellExtBuf;
	int		len;
	int		job_idx = -1;

	BOOL	is_openwin			= FALSE;
	BOOL	is_noexec			= FALSE;
	BOOL	is_delete			= FALSE;
	BOOL	is_estimate			= FALSE;
	BOOL	is_filter			= FALSE;
	BOOL	is_job_filter		= FALSE;

	void	*CMD_STR			= GetLoadStrV(IDS_CMD_OPT);
	void	*BUSIZE_STR			= GetLoadStrV(IDS_BUFSIZE_OPT);
	void	*LOG_STR			= GetLoadStrV(IDS_LOG_OPT);
	void	*FORCESTART_STR		= GetLoadStrV(IDS_FORCESTART_OPT);
	void	*SKIPEMPTYDIR_STR	= GetLoadStrV(IDS_SKIPEMPTYDIR_OPT);
	void	*ERRSTOP_STR		= GetLoadStrV(IDS_ERRSTOP_OPT);
	void	*ESTIMATE_STR		= GetLoadStrV(IDS_ESTIMATE_OPT);
	void	*AUTOSLOW_STR		= GetLoadStrV(IDS_AUTOSLOW_OPT);
	void	*DISKMODE_STR		= GetLoadStrV(IDS_DISKMODE_OPT);
	void	*DISKMODE_SAME_STR	= GetLoadStrV(IDS_DISKMODE_SAME);
	void	*DISKMODE_DIFF_STR	= GetLoadStrV(IDS_DISKMODE_DIFF);
	void	*DISKMODE_AUTO_STR	= GetLoadStrV(IDS_DISKMODE_AUTO);
	void	*OPENWIN_STR		= GetLoadStrV(IDS_OPENWIN_OPT);
	void	*AUTOCLOSE_STR		= GetLoadStrV(IDS_AUTOCLOSE_OPT);
	void	*FORCECLOSE_STR		= GetLoadStrV(IDS_FORCECLOSE_OPT);
	void	*NOEXEC_STR			= GetLoadStrV(IDS_NOEXEC_OPT);
	void	*SHELLEXT1_STR		= GetLoadStrV(IDS_SHEXT1_OPT);
	void	*SHELLEXT2_STR		= GetLoadStrV(IDS_SHEXT2_OPT);
	void	*SHELLEXT4_STR		= GetLoadStrV(IDS_SHEXT4_OPT);
	void	*FCSHEXT1_STR		= GetLoadStrV(IDS_FCSHEXT1_OPT);
	void	*NOCONFIRMDEL_STR	= GetLoadStrV(IDS_NOCONFIRMDEL_OPT);
	void	*INCLUDE_STR		= GetLoadStrV(IDS_INCLUDE_OPT);
	void	*EXCLUDE_STR		= GetLoadStrV(IDS_EXCLUDE_OPT);
	void	*REGEXP_STR			= GetLoadStrV(IDS_REGEXP_OPT);
	void	*JOB_STR			= GetLoadStrV(IDS_JOB_OPT);
	void	*TO_STR				= GetLoadStrV(IDS_TO_OPT);
	void	*p;

	argc--, argv++;		// 幚峴僼傽僀儖柤偼 skip

	while (*argv && GetChar(*argv, 0) == '/') {
		if (strnicmpV(*argv, CMD_STR, len = strlenV(CMD_STR)) == 0) {
			int idx = CmdNameToComboIndex(MakeAddr(*argv, len));
			if (idx == -1)
				return	MessageBox(GetLoadStr(IDS_USAGE), "Illegal Command"), FALSE;

			// 僐儅儞僪儌乕僪傪慖戰
			SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, idx, 0);
		}
		else if (strnicmpV(*argv, JOB_STR, len = strlenV(JOB_STR)) == 0) {
			if ((job_idx = cfg.SearchJobV(MakeAddr(*argv, len))) == -1)
				return	MessageBox(GetLoadStr(IDS_JOBNOTFOUND), "Illegal Command"), FALSE;
			SetJob(job_idx);
			if (GetChar(cfg.jobArray[job_idx]->includeFilter, 0) || GetChar(cfg.jobArray[job_idx]->excludeFilter, 0))
				is_job_filter = TRUE;
		}
		else if (strnicmpV(*argv, BUSIZE_STR, len = strlenV(BUSIZE_STR)) == 0) {
			SetDlgItemTextV(BUFSIZE_EDIT, MakeAddr(*argv, len));
		}
		else if (strnicmpV(*argv, LOG_STR, len = strlenV(LOG_STR)) == 0) {
			isErrLog = GetArgOpt(MakeAddr(*argv, len), TRUE);
		}
		else if (strnicmpV(*argv, FORCESTART_STR, len = strlenV(FORCESTART_STR)) == 0) {
			forceStart = GetArgOpt(MakeAddr(*argv, len), TRUE);
		}
		else if (strnicmpV(*argv, SKIPEMPTYDIR_STR, len = strlenV(SKIPEMPTYDIR_STR)) == 0) {
			skipEmptyDir = GetArgOpt(MakeAddr(*argv, len), TRUE);
		}
		else if (strnicmpV(*argv, ERRSTOP_STR, len = strlenV(ERRSTOP_STR)) == 0) {
			::CheckDlgButton(hWnd, IGNORE_CHECK, GetArgOpt(MakeAddr(*argv, len), FALSE) ? TRUE : FALSE);
		}
		else if (strnicmpV(*argv, ESTIMATE_STR, len = strlenV(ESTIMATE_STR)) == 0) {
			is_estimate = GetArgOpt(MakeAddr(*argv, len), TRUE);
		}
		else if (strnicmpV(*argv, AUTOSLOW_STR, len = strlenV(AUTOSLOW_STR)) == 0) {
			::CheckDlgButton(hWnd, AUTOSLOW_CHECK, isAutoSlow = (GetArgOpt(MakeAddr(*argv, len), TRUE) ? TRUE : FALSE));
		}
		else if (strnicmpV(*argv, OPENWIN_STR, len = strlenV(OPENWIN_STR)) == 0) {
			is_openwin = GetArgOpt(MakeAddr(*argv, len), TRUE);
		}
		else if (strnicmpV(*argv, AUTOCLOSE_STR, len = strlenV(AUTOCLOSE_STR)) == 0) {
			autoCloseLevel = (AutoCloseLevel)GetArgOpt(MakeAddr(*argv, len), NOERR_CLOSE);
		}
		else if (strnicmpV(*argv, FORCECLOSE_STR, strlenV(FORCECLOSE_STR)) == 0) {
			autoCloseLevel = FORCE_CLOSE;
		}
		else if (strnicmpV(*argv, NOEXEC_STR, strlenV(NOEXEC_STR)) == 0) {
			is_noexec = TRUE;
		}
		else if (strnicmpV(*argv, DISKMODE_STR, len = strlenV(DISKMODE_STR)) == 0) {
			if (lstrcmpiV(MakeAddr(*argv, len), DISKMODE_SAME_STR) == 0)
				diskMode = 1;
			else if (lstrcmpiV(MakeAddr(*argv, len), DISKMODE_DIFF_STR) == 0)
				diskMode = 2;
			else
				diskMode = 0;
		}
		else if (strnicmpV(*argv, INCLUDE_STR, len = strlenV(INCLUDE_STR)) == 0) {
			is_filter = TRUE;
			SetDlgItemTextV(INCLUDE_COMBO, strtok_pathV(MakeAddr(*argv, len), EMPTY_STR_V, &p));
		}
		else if (strnicmpV(*argv, EXCLUDE_STR, len = strlenV(EXCLUDE_STR)) == 0) {
			is_filter = TRUE;
			SetDlgItemTextV(EXCLUDE_COMBO, strtok_pathV(MakeAddr(*argv, len), EMPTY_STR_V, &p));
		}
		else if (strnicmpV(*argv, REGEXP_STR, strlenV(REGEXP_STR)) == 0) {
			isRegExp = TRUE;
		}
		else if (strnicmpV(*argv, SHELLEXT1_STR, strlenV(SHELLEXT1_STR)) == 0
			|| strnicmpV(*argv, SHELLEXT2_STR, strlenV(SHELLEXT2_STR)) == 0
			|| strnicmpV(*argv, SHELLEXT4_STR, strlenV(SHELLEXT4_STR)) == 0) {
			if (TMsgBox(this).Exec(GetLoadStr(IDS_UPDATE), FASTCOPY, MB_OKCANCEL) == IDOK)
				UpdateShellExt(&cfg);
			return	FALSE;
		}
		else if (strnicmpV(*argv, FCSHEXT1_STR, strlenV(FCSHEXT1_STR)) == 0) {
			isShellExt = TRUE;
			is_openwin = !cfg.shextTaskTray;
			autoCloseLevel = cfg.shextAutoClose ? NOERR_CLOSE : NO_CLOSE;
			HANDLE	hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
			DWORD	read_size;
			BOOL	convertErr = FALSE;

			shellExtBuf.AllocBuf(SHELLEXT_MIN_ALLOC, SHELLEXT_MAX_ALLOC);
			while (::ReadFile(hStdInput, shellExtBuf.Buf() + shellExtBuf.UsedSize(), shellExtBuf.RemainSize(), &read_size, 0) && read_size > 0) {
				if (shellExtBuf.AddUsedSize(read_size) == shellExtBuf.Size())
					shellExtBuf.Grow(SHELLEXT_MIN_ALLOC);
			}
			shellExtBuf.Buf()[shellExtBuf.UsedSize()] = 0;

			if (convertErr)
				return	FALSE;
			if ((argv = CommandLineToArgvV(shellExtBuf.Buf(), &argc)) == NULL)
				break;
			continue;	// 嵞 parse
		}
		else if (strnicmpV(*argv, NOCONFIRMDEL_STR, strlenV(NOCONFIRMDEL_STR)) == 0) {
			noConfirmDel = TRUE;
		}
		else
			return	MessageBoxV(GetLoadStrV(IDS_USAGE), *argv), FALSE;
		argc--, argv++;
	}

	is_delete = GetCopyMode() == FastCopy::DELETE_MODE;

	if (job_idx == -1) {

⌨️ 快捷键说明

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