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

📄 mainwin.cpp

📁 fastcopy是一个非常快速的数据拷贝软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		| (IsDlgButtonChecked(STREAM_CHECK) && IS_WINNT_V ? FastCopy::WITH_ALTSTREAM : 0)
		| (!is_delete_mode && IsDlgButtonChecked(ESTIMATE_CHECK) && !is_listing ? FastCopy::PRE_SEARCH : 0)
		| (is_delete_mode && IsDlgButtonChecked(OWDEL_CHECK) ? cfg.enableNSA ? FastCopy::OVERWRITE_DELETE_NSA : FastCopy::OVERWRITE_DELETE : 0)
		| (cfg.isSameDirRename ? FastCopy::SAMEDIR_RENAME : 0)
		| (cfg.isAutoSlowIo ? FastCopy::AUTOSLOW_IOLIMIT : 0)
		| (is_listing ? FastCopy::LISTING_ONLY : 0)
		| (skipEmptyDir && is_filter ? FastCopy::SKIP_EMPTYDIR : 0)
		| ((!isReparse && IS_WINNT_V) && info.mode != FastCopy::MOVE_MODE && info.mode != FastCopy::DELETE_MODE ? (FastCopy::FILE_REPARSE|FastCopy::DIR_REPARSE) : 0)
		| (is_listing && (::GetAsyncKeyState(VK_CONTROL) & 0x8000) && (::GetAsyncKeyState(VK_SHIFT) & 0x8000) ? FastCopy::VERIFY_FILE : 0)
		| (diskMode == 0 ? 0 : diskMode == 1 ? FastCopy::FIX_SAMEDISK : FastCopy::FIX_DIFFDISK);
	info.bufSize		= GetDlgItemInt(BUFSIZE_EDIT) * 1024 * 1024;
	info.maxTransSize	= cfg.maxTransSize * 1024 * 1024;
	info.maxOpenFiles	= cfg.maxOpenFiles;
	info.maxAttrSize	= cfg.maxAttrSize;
	info.maxDirSize		= cfg.maxDirSize;
	info.nbMinSizeNtfs	= cfg.nbMinSizeNtfs * 1024;
	info.nbMinSizeFat	= cfg.nbMinSizeFat * 1024;
	info.hNotifyWnd		= hWnd;
	info.uNotifyMsg		= WM_FASTCOPY_MSG;
	errBufOffset		= 0;
	listBufOffset		= 0;

	memset(&ti, 0, sizeof(ti));

	int		src_len = ::GetWindowTextLengthV(GetDlgItem(SRC_COMBO)) + 1;
	int		dst_len = ::GetWindowTextLengthV(GetDlgItem(DST_COMBO)) + 1;
	if (src_len <= 1 || !is_delete_mode && dst_len <= 1)
		return	FALSE;

	WCHAR	*src = new WCHAR [src_len], dst[MAX_PATH_EX] = L"";
	BOOL	ret = TRUE;
	BOOL	exec_confirm = cfg.execConfirm || (::GetAsyncKeyState(VK_CONTROL) & 0x8000);

	if (!exec_confirm) {
		if (isShellExt && (exec_flags & CMDLINE_EXEC))
			exec_confirm = is_delete_mode ? !cfg.shextRNoConfirm : !cfg.shextDdNoConfirm;
		else
			exec_confirm = is_delete_mode ? !noConfirmDel : cfg.execConfirm;
	}

	if (GetDlgItemTextV(SRC_COMBO, src, src_len) == 0 || !is_delete_mode && GetDlgItemTextV(DST_COMBO, dst, MAX_PATH_EX) == 0) {
		TMsgBox(this).Exec("Can't get src or dst field");
		ret = FALSE;
	}
	SendDlgItemMessage(PATH_EDIT, WM_SETTEXT, 0, (LPARAM)"");
	SendDlgItemMessage(STATUS_EDIT, WM_SETTEXT, 0, (LPARAM)"");

	PathArray	srcArray, dstArray, incArray, excArray;
	srcArray.RegisterMultiPath(src);
	if (!is_delete_mode)
		dstArray.RegisterPath(dst);

	// 僼傿儖僞
	WCHAR	*inc = NULL, *exc = NULL;
	if (is_filter) {
		DWORD	inc_len = ::GetWindowTextLengthV(GetDlgItem(INCLUDE_COMBO));
		DWORD	exc_len = ::GetWindowTextLengthV(GetDlgItem(EXCLUDE_COMBO));
		inc = new WCHAR [inc_len + 1];
		exc = new WCHAR [exc_len + 1];
		if (GetDlgItemTextV(INCLUDE_COMBO, inc, inc_len +1) == inc_len &&
			GetDlgItemTextV(EXCLUDE_COMBO, exc, exc_len +1) == exc_len) {
			incArray.RegisterMultiPath(inc);
			excArray.RegisterMultiPath(exc);
		}
		else ret = FALSE;
	}

	// 妋擣梡僼傽僀儖堦棗
	if (!ret || !(ret = fastCopy.RegisterInfo(&srcArray, &dstArray, &info, &incArray, &excArray))) {
		SetDlgItemText(STATUS_EDIT, "Error");
	}

	int	src_list_len = src_len + srcArray.Num() * 4;
	void *src_list = new WCHAR [src_list_len];

	if (ret && exec_confirm && (exec_flags & LISTING_EXEC) == 0) {
		srcArray.GetMultiPath(src_list, src_list_len, NEWLINE_STR_V, EMPTY_STR_V);
		void	*title = info.mode == FastCopy::MOVE_MODE ? GetLoadStrV(IDS_MOVECONFIRM) : info.isRenameMode ? GetLoadStrV(IDS_DUPCONFIRM): NULL;
		int		sv_flags = info.flags;	// delete confirm 偱曄壔偟側偄偐妋擣

		switch (TExecConfirmDlg(&info, &cfg, this, title, isShellExt).Exec(src_list, is_delete_mode ? NULL : dst)) {
		case IDOK:
			break;

		case RUNAS_BUTTON:
			ret = FALSE;
			RunAsAdmin(RUNAS_IMMEDIATE);
			break;

		default:
			ret = FALSE;
			if (isShellExt && !is_delete_mode)
				autoCloseLevel = NO_CLOSE;
			break;
		}

		if (ret && is_delete_mode && info.flags != sv_flags) {	// flag 偑曄壔偟偰偄偨応崌偼丄嵞搊榐
			ret = fastCopy.RegisterInfo(&srcArray, &dstArray, &info, &incArray, &excArray);
		}
	}

	if (ret) {
		if (is_delete_mode ? cfg.EntryDelPathHistory(src) : cfg.EntryPathHistory(src, dst))
			SetPathHistory(FALSE);
		if (is_filter && cfg.EntryFilterHistory(inc, exc))
			SetFilterHistory(FALSE);
		cfg.WriteIni();
	}

	int	pathLogMax = src_len * CHAR_LEN_V + sizeof(dst);

	if (ret && (pathLogBuf = new char [pathLogMax])) {
		int len = sprintf(pathLogBuf, "<Source>  %s", isUtf8Log ? WtoU8(src) : IS_WINNT_V ? WtoA(src) : (char *)src);
		if (!is_delete_mode) {
			len += sprintf(pathLogBuf + len, "\r\n<DestDir> %s", isUtf8Log ? WtoU8(dst) : IS_WINNT_V ? WtoA(dst) : (char *)dst);
		}
		if (inc && GetChar(inc, 0)) {
			len += sprintf(pathLogBuf + len, "\r\n<Include> %s", isUtf8Log ? WtoU8(inc) : IS_WINNT_V ? WtoA(inc) : (char *)inc);
		}
		if (exc && GetChar(exc, 0)) {
			len += sprintf(pathLogBuf + len, "\r\n<Exclude> %s", isUtf8Log ? WtoU8(exc) : IS_WINNT_V ? WtoA(exc) : (char *)exc);
		}
		len += sprintf(pathLogBuf + len, "\r\n<Command> %s", isUtf8Log ? AtoU8(COPYINFO_LIST[idx].list_str) : COPYINFO_LIST[idx].list_str);
		if (info.flags & (FastCopy::WITH_ACL|FastCopy::WITH_ALTSTREAM|FastCopy::OVERWRITE_DELETE|FastCopy::OVERWRITE_DELETE_NSA)) {
			len += sprintf(pathLogBuf + len, " (with");
			if (!is_delete_mode && (info.flags & FastCopy::WITH_ACL))		len += sprintf(pathLogBuf + len, " ACL");
			if (!is_delete_mode && (info.flags & FastCopy::WITH_ALTSTREAM))	len += sprintf(pathLogBuf + len, " AltStream");
			if (is_delete_mode && (info.flags & FastCopy::OVERWRITE_DELETE))len += sprintf(pathLogBuf + len, " OverWrite");
			if (is_delete_mode && (info.flags & FastCopy::OVERWRITE_DELETE_NSA)) len += sprintf(pathLogBuf + len, " NSA");
			len += sprintf(pathLogBuf + len, ")");
		}
		len += sprintf(pathLogBuf + len , "\r\n\r\n");
	}

	delete [] exc;
	delete [] inc;
	delete [] src_list;
	delete [] src;

	if (ret) {
		SendDlgItemMessage(PATH_EDIT, EM_SETTARGETDEVICE, 0, IsListing() ? 1 : 0);	// 愜傝曉偟
		SetMiniWindow();
		SetDlgItemText(ERR_EDIT, "");

		if (forceStart == 1 || forceStart == 0 && is_delete_mode || fastCopy.TakeExclusivePriv()) {
			if (forceStart == 1 && !is_delete_mode)
				fastCopy.TakeExclusivePriv();
			ret = ExecCopyCore();
		}
		else {
			isDelay = TRUE;
			::SetTimer(hWnd, FASTCOPY_TIMER, 300, NULL);
			if (isTaskTray)
				TaskTray(NIM_MODIFY, hMainIcon[FCWAIT_ICON_INDEX], FASTCOPY);
		}

		if (ret) {
			SetDlgItemText(IsListing() ? LIST_BUTTON : IDOK, GetLoadStr(IDS_CANCEL));
			RefreshWindow(TRUE);
			if (IsWinVista() && !TIsUserAnAdmin()) {
				::EnableMenuItem(GetMenu(hWnd), ADMIN_MENUITEM, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
				::DrawMenuBar(hWnd);
			}
		}
	}
	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);
		UpdateSpeedLevel();
		SetPriority(speedLevel != SPEED_FULL ? IDLE_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS);
	}
	return	ret;
}

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

	SetPriority(NORMAL_PRIORITY_CLASS);
	::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) {
				if (IS_WINNT_V) {
					VBuf	buf(errBufOffset * 3 / 2);
					len = ::WideCharToMultiByte(cfg.isUtf8Log ? CP_UTF8 : CP_ACP, 0, (WCHAR *)ti.errBuf->Buf(), errBufOffset / sizeof(WCHAR), (char *)buf.Buf(), buf.Size(), 0, 0);
					::WriteFile(hErrLogFile, buf.Buf(), len, &len, 0);
				}
				else {
					::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;

	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;
	isShellExt = FALSE;
	RefreshWindow(TRUE);
	UpdateMenu();

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

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

	if (IsWinVista() && !TIsUserAnAdmin()) {
		::EnableMenuItem(GetMenu(hWnd), ADMIN_MENUITEM, MF_BYCOMMAND|MF_ENABLED);
		::DrawMenuBar(hWnd);
	}

	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;

	case WM_FASTCOPY_RUNAS:
		{
			HANDLE	hWrite = (HANDLE)lParam;
			DWORD	size = RunasShareSize();
			::WriteFile(hWrite, RunasShareData(), size, &size, NULL);
			::CloseHandle(hWrite);
		}
		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 {
		UpdateSpeedLevel(TRUE);

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

	return	TRUE;
}

DWORD TMainDlg::UpdateSpeedLevel(BOOL is_timer)
{
	DWORD	waitCnt = fastCopy.GetWaitTick();
	DWORD	newWaitCnt = waitCnt;

	if (speedLevel == SPEED_FULL) {
		newWaitCnt = 0;
	}
	else if (speedLevel == SPEED_AUTO) {
		POINT	pt;
		::GetCursorPos(&pt);
		HWND	foreWnd = ::GetForegroundWindow();

		if (foreWnd == hWnd) {
			newWaitCnt = 0;
		}
		else if (pt.x != curPt.x || pt.y != curPt.y || foreWnd != curForeWnd) {
			curPt = pt;
			curForeWnd = foreWnd;
			newWaitCnt = cfg.waitTick;
		}
		else if (is_timer && waitCnt > 0 && (timerCnt % 6) == 0) {
			newWaitCnt -= 1;
		}
	}
	else if (speedLevel == SPEED_SUSPEND) {
		newWaitCnt = FastCopy::SUSPEND_WAITTICK;
	}
	else {
		static DWORD	waitArray[]    = { 2560, 1280, 640, 320, 160, 80, 40, 20, 10 };
		newWaitCnt = waitArray[speedLevel - 1];
	}

	fastCopy.SetWaitTick(newWaitCnt);

	return	newWaitCnt;
}

BOOL TMainDlg::RunAsAdmin(DWORD flg)

⌨️ 快捷键说明

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