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

📄 mainwin.cpp

📁 FastCopy 利用缓冲技术加快文件拷贝
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		SetDlgItemText(SRC_COMBO, "");
		SetDlgItemText(DST_COMBO, "");
	}
	PathArray	pathArray;

	int		path_len = 0;
	WCHAR	wBuf[MAX_PATH_EX];

	while (*argv && GetChar(*argv, 0) != '/') {
		void	*path = *argv;
		if (isShellExt && !is_delete) {
			if (NetPlaceConvertV(path, wBuf)) {
				path = wBuf;
				isNetPlaceSrc = TRUE;
			}
		}
		pathArray.RegisterPath(path);
		path_len += strlenV(path) + 3;
		argc--, argv++;
	}

	void	*path = new WCHAR [path_len];
	if (pathArray.GetMultiPath(path, path_len))
		SetDlgItemTextV(SRC_COMBO, path);
	delete [] path;

	void	*dst_path	= NULL;
	if (argc == 1 && strnicmpV(*argv, TO_STR, strlenV(TO_STR)) == 0) {
		dst_path = MakeAddr(*argv, strlenV(TO_STR));
		if (isShellExt && NetPlaceConvertV(dst_path, wBuf))
			dst_path = wBuf;
		SetDlgItemTextV(DST_COMBO, dst_path);
	}
	else if (argc >= 1)
		return	MessageBox(GetLoadStr(IDS_USAGE), "Too few/many argument"), FALSE;

	if ((is_filter || is_job_filter) && (GetCopyMode() == FastCopy::MOVE_MODE))
		return	MessageBox(GetLoadStr(IDS_NOFILTER_USAGE), FASTCOPY), FALSE;

	if (::GetWindowTextLengthV(GetDlgItem(SRC_COMBO)) == 0 || (!is_delete && ::GetWindowTextLengthV(GetDlgItem(DST_COMBO)) == 0)) {
		is_noexec = TRUE;
		if (isShellExt)			// 僐僺乕愭偺柍偄 shell婲摦帪偼丄autoclose 傪柍帇偡傞
			autoCloseLevel = NO_CLOSE;
	}

	if (is_filter && !is_job_filter)
		ReflectFilterCheck(TRUE);

	SetItemEnable(is_delete);
	if (diskMode)
		UpdateMenu();

	if (!is_delete && (is_estimate || !isShellExt && !is_noexec && cfg.estimateMode && !is_estimate))
		::CheckDlgButton(hWnd, ESTIMATE_CHECK, is_estimate);

	if (is_openwin || is_noexec)
		Show();
	else
		TaskTray(NIM_ADD, hMainIcon[FCNORMAL_ICON_INDEX], FASTCOPY);

	return	is_noexec ? TRUE : ExecCopy(CMDLINE_EXEC);
}

BOOL TMainDlg::TaskTray(int nimMode, HICON hSetIcon, LPCSTR tip)
{
	NOTIFYICONDATA	tn;

	isTaskTray = nimMode == NIM_DELETE ? FALSE : TRUE;

	memset(&tn, 0, sizeof(tn));
	tn.cbSize = sizeof(tn);
	tn.hWnd = hWnd;
	tn.uID = FASTCOPY_NIM_ID;		// test
	tn.uFlags = NIF_MESSAGE|(hSetIcon ? NIF_ICON : 0)|(tip ? NIF_TIP : 0);
	tn.uCallbackMessage = WM_FASTCOPY_NOTIFY;
	tn.hIcon = hSetIcon;
	if (tip)
		sprintf(tn.szTip, "%.63s", tip);

	return	::Shell_NotifyIcon(nimMode, &tn);
}

BOOL TMainDlg::SetInfo(BOOL is_task_tray, BOOL is_finish_status)
{
	char	buf[512];
	int		len = 0;
	double	doneRate;
	int		done_rate_i;
	int		remain_sec, total_sec, remain_h, remain_m, remain_s;

	fastCopy.GetTransInfo(&ti, is_task_tray ? FALSE : TRUE);
	if (ti.tickCount == 0)
		ti.tickCount++;

	if (IsListing() && ti.listBuf->UsedSize() > listBufOffset) {
		::EnterCriticalSection(ti.listCs);
		int offset_v = listBufOffset / CHAR_LEN_V;
		SendDlgItemMessageV(PATH_EDIT, EM_SETSEL, offset_v, offset_v);
		SendDlgItemMessageV(PATH_EDIT, EM_REPLACESEL, 0, (LPARAM)(ti.listBuf->Buf() + listBufOffset));
		listBufOffset = ti.listBuf->UsedSize();
		::LeaveCriticalSection(ti.listCs);
	}

#define FILERATE_WARTERMARK	5

	if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch) {
		double	preFiles, preTrans, doneFiles, doneTrans, fileRate;
		int		misc_files = ti.total.skipFiles + ti.total.skipDirs + ti.total.errFiles + ti.total.errDirs;
		if (info.mode == FastCopy::DELETE_MODE) {
			preFiles = ti.total.preFiles + ti.total.preDirs + 0.01;
			doneFiles = ti.total.deleteFiles + ti.total.deleteDirs + misc_files + 0.01;
			doneRate = doneFiles / preFiles;
		}
		else {
			preFiles = (ti.total.preFiles + ti.total.preDirs) * 2 + 0.01;
			preTrans = (double)(ti.total.preTrans * 2 + 0.01);
			doneFiles = (ti.total.writeFiles + ti.total.writeDirs + ti.total.readFiles + ti.total.readDirs + (misc_files) * 2) + 0.01;
			doneTrans = (double)(ti.total.writeTrans + ti.total.readTrans + (ti.total.skipTrans + ti.total.errTrans) * 2 + 0.01);
			doneRate = ((doneFiles / preFiles) + (doneTrans / preTrans)) / 2;
			if ((fileRate = doneFiles / (ti.tickCount / 1000)) < FILERATE_WARTERMARK) {
				if (((preTrans - doneTrans) / (preFiles - doneFiles + 1)) > (doneTrans / doneFiles) / (FILERATE_WARTERMARK / fileRate))
					doneRate = (doneTrans / preTrans);
			}
		}
		remain_sec = (int)((ti.tickCount / doneRate - ti.tickCount) / 1000);
		total_sec = (int)(ti.tickCount / doneRate / 1000);
		remain_h = remain_sec / 3600, remain_m = (remain_sec % 3600) / 60, remain_s = remain_sec % 60;
		done_rate_i = (int)(doneRate * 100);
		SetWindowTitle("(%d%%) FastCopy %s", done_rate_i, GetVersionStr());
	}

	if (is_task_tray) {
		if (info.mode == FastCopy::DELETE_MODE) {
			len += sprintf(buf + len, IsListing() ?
				"FastCopy (%.1fMB %dfiles %dsec)" :
				"FastCopy (%.1fMB %dfiles %dsec %.2fMB/s)",
				(double)ti.total.deleteTrans / (1024 * 1024),
				ti.total.deleteFiles,
				ti.tickCount / 1000,
				(double)ti.total.deleteFiles * 1000 / ti.tickCount);
		}
		else if (ti.total.isPreSearch) {
			len += sprintf(buf + len, " Estimating (Total %.1f MB/%d files/%d sec)",
				(double)ti.total.preTrans / (1024 * 1024),
				ti.total.preFiles,
				(int)(ti.tickCount / 1000));
		}
		else {
			if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch && !is_finish_status && doneRate >= 0.0001) {
				len += sprintf(buf + len, "%d%% (Remain %02d:%02d:%02d) ",
					done_rate_i, remain_h, remain_m, remain_s);
			}
			len += sprintf(buf + len, IsListing() ?
				"FastCopy (%.1fMB %dfiles %dsec)" :
				"FastCopy (%.1fMB %dfiles %dsec %.2fMB/s)",
				(double)ti.total.writeTrans / (1024 * 1024),
				ti.total.writeFiles,
				ti.tickCount / 1000,
				(double)ti.total.writeTrans / ti.tickCount / 1024 * 1000 / 1024
				);
		}
		TaskTray(NIM_MODIFY, hMainIcon[curIconIndex = (curIconIndex+1) % MAX_NORMAL_FASTCOPY_ICON], buf);
		return	TRUE;
	}

	if (ti.total.isPreSearch) {
		len += sprintf(buf + len,
			" ---- Estimating ... ----\r\n"
			"PreTrans = %.1f MB\r\n"
			"PreFiles = %d (%d)\r\n"
			"PreTime  = %.2f sec\r\n"
			"PreRate  = %.2f files/s",
			(double)ti.total.preTrans / (1024 * 1024),
			ti.total.preFiles, ti.total.preDirs,
			(double)ti.tickCount / 1000,
			(double)ti.total.preFiles * 1000 / ti.tickCount);
	}
	else if (info.mode == FastCopy::DELETE_MODE) {
		len += sprintf(buf + len, IsListing() ?
			"TotalDel  = %.1f MB\r\n"
			"DelFiles  = %d (%d)\r\n"
			"TotalTime = %.2f sec\r\n" :
			"TotalDel  = %.1f MB\r\n"
			"DelFiles  = %d (%d)\r\n"
			"TotalTime = %.2f sec\r\n"
			"FileRate   = %.2f files/s",
			(double)ti.total.deleteTrans / (1024 * 1024),
			ti.total.deleteFiles, ti.total.deleteDirs,
			(double)ti.tickCount / 1000,
			(double)ti.total.deleteFiles * 1000 / ti.tickCount);
	}
	else {
		if (IsListing()) {
			len = sprintf(buf + len,
				"TotalSize = %.1f MB\r\n"
				"TotalFiles = %d (%d)\r\n"
				, (double)ti.total.writeTrans / (1024 * 1024)
				, ti.total.writeFiles, ti.total.writeDirs);
		}
		else {
			len = sprintf(buf + len,
				"TotalRead = %.1f MB\r\n"
				"TotalWrite = %.1f MB\r\n"
				"TotalFiles = %d (%d)\r\n"
				, (double)ti.total.readTrans / (1024 * 1024)
				, (double)ti.total.writeTrans / (1024 * 1024)
				, ti.total.writeFiles, ti.total.writeDirs);
		}

		if (ti.total.skipFiles || ti.total.skipDirs) {
			len += sprintf(buf + len,
				"TotalSkip = %.1f MB\r\n"
				"SkipFiles = %d (%d)\r\n"
				, (double)ti.total.skipTrans / (1024 * 1024)
				, ti.total.skipFiles, ti.total.skipDirs);
		}
		if (ti.total.deleteFiles || ti.total.deleteDirs) {
			len += sprintf(buf + len,
				"TotalDel  = %.1f MB\r\n"
				"DelFiles  = %d (%d)\r\n"
				, (double)ti.total.deleteTrans / (1024 * 1024)
				, ti.total.deleteFiles, ti.total.deleteDirs);
		}
		len += sprintf(buf + len, IsListing() ?
			"TotalTime = %.2f sec\r\n" :
			"TotalTime = %.2f sec\r\n"
			"TransRate = %.2f MB/s\r\n"
			"FileRate   = %.2f files/s"
			, (double)ti.tickCount / 1000
			, (double)ti.total.writeTrans / ti.tickCount / 1024 * 1000 / 1024
			, (double)ti.total.writeFiles * 1000 / ti.tickCount);
	}

	if ((info.flags & FastCopy::PRE_SEARCH) && !ti.total.isPreSearch && !is_finish_status && doneRate >= 0.0001) {
		len += sprintf(buf + len, "\r\n -- Remain %02d:%02d:%02d (%d%%) --", remain_h, remain_m, remain_s, done_rate_i);
	}
	else if (IsListing() && is_finish_status) {
		len += sprintf(buf + len, "\r\n -- Listing Done --");
	}
	SetDlgItemText(STATUS_EDIT, buf);

	if (IsListing()) {
		if (is_finish_status) {
			int offset_v = listBufOffset / CHAR_LEN_V;
			sprintf(buf, "\r\nFinished. (ErrorFiles : %d  ErrorDirs : %d)", ti.total.errFiles, ti.total.errDirs);
			SendDlgItemMessageV(PATH_EDIT, EM_SETSEL, offset_v, offset_v);
			SendDlgItemMessage(PATH_EDIT, EM_REPLACESEL, 0, (LPARAM)buf);
//			int line = SendDlgItemMessage(PATH_EDIT, EM_GETLINECOUNT, 0, 0);
//			SendDlgItemMessage(PATH_EDIT, EM_LINESCROLL, 0, line > 2 ? line -2 : 0);
		}
	}
	else if (is_finish_status) {
		sprintf(buf, ti.total.errFiles || ti.total.errDirs ? "Finished. (ErrorFiles : %d  ErrorDirs : %d)" : "Finished.", ti.total.errFiles, ti.total.errDirs);
		SetDlgItemText(PATH_EDIT, buf);
		SetWindowTitle("FastCopy %s", GetVersionStr());
	}
	else
		SetDlgItemTextV(PATH_EDIT, ti.total.isPreSearch ? EMPTY_STR_V : ti.curPath);

	SetDlgItemText(SAMEDRV_STATIC, ti.isSameDrv ? GetLoadStr(IDS_SAMEDISK) : GetLoadStr(IDS_DIFFDISK));

	sprintf(buf, ti.autoSlow && !is_finish_status ? "slow(%d)" : "", ti.autoSlow);
	SetDlgItemText(AUTOSLOW_STATIC, buf);

	if (info.ignoreErr != ti.ignoreErr)
		::CheckDlgButton(hWnd, IGNORE_CHECK, info.ignoreErr = ti.ignoreErr);

	if (isErrEditHide && ti.errBuf->UsedSize() > 0) {
		SetNormalWindow();
	}
	if (ti.errBuf->UsedSize() > errBufOffset || errBufOffset == MAX_ERR_BUF) {
		if (errBufOffset != MAX_ERR_BUF) {
			::EnterCriticalSection(ti.errCs);
			SendDlgItemMessage(ERR_EDIT, EM_SETSEL, errBufOffset, errBufOffset);
			SendDlgItemMessage(ERR_EDIT, EM_REPLACESEL, 0, (LPARAM)(ti.errBuf->Buf() + errBufOffset));
			errBufOffset = ti.errBuf->UsedSize();
			::LeaveCriticalSection(ti.errCs);
		}
		sprintf(buf, "(ErrFiles : %d / ErrDirs : %d)", ti.total.errFiles, ti.total.errDirs);
		SetDlgItemText(ERRSTATUS_STATIC, buf);
	}
	return	TRUE;
}

BOOL TMainDlg::SetWindowTitle(char *fmt,...)
{
	char	buf[1024];

	va_list	va;
	va_start(va, fmt);
	DWORD	len = wvsprintf(buf, fmt, va);
	va_end(va);

	return	SetWindowText(buf);
}

void TMainDlg::SetItemEnable(BOOL is_delete)
{
	::EnableWindow(GetDlgItem(DST_FILE_BUTTON), !is_delete);
	::EnableWindow(GetDlgItem(DST_COMBO), !is_delete);
	::ShowWindow(GetDlgItem(ESTIMATE_CHECK), is_delete ? SW_HIDE : SW_SHOW);
	ReflectFilterCheck();
}

const char *GetVersionStr(void)
{
	static char *version_str;

	if (version_str == NULL)
		version_str = strstr(mainwin_id, "ver");

	return	version_str;
}

void TMainDlg::UpdateMenu(void)
{
	HMENU	hMenu;
	int		i;

	hMenu = ::GetSubMenu(::GetMenu(hWnd), 1);
	while (::GetMenuItemCount(hMenu) > 2 && ::DeleteMenu(hMenu, 2, MF_BYPOSITION))
		;

	for (i=0; i < cfg.jobMax; i++) {
		InsertMenuV(hMenu, i + 2, MF_STRING|MF_BYPOSITION, JOBOBJ_MENUITEM_START + i, cfg.jobArray[i]->title);
	}

	hMenu = ::GetSubMenu(::GetMenu(hWnd), 2);
	::CheckMenuItem(hMenu, AUTODISK_MENUITEM, MF_BYCOMMAND|((diskMode == 0) ? MF_CHECKED : MF_UNCHECKED));
	::CheckMenuItem(hMenu, SAMEDISK_MENUITEM, MF_BYCOMMAND|((diskMode == 1) ? MF_CHECKED : MF_UNCHECKED));
	::CheckMenuItem(hMenu, DIFFDISK_MENUITEM, MF_BYCOMMAND|((diskMode == 2) ? MF_CHECKED : MF_UNCHECKED));

	if (!fastCopy.IsStarting() && !isDelay) {
		SetDlgItemText(SAMEDRV_STATIC, diskMode == 0 ? "" : diskMode == 1 ? GetLoadStr(IDS_FIX_SAMEDISK) : GetLoadStr(IDS_FIX_DIFFDISK));
	}
}

void TMainDlg::SetJob(int idx)
{
	Job	*job = cfg.jobArray[idx];
	idx = CmdNameToComboIndex(job->cmd);

	if (idx == -1)
		return;

	SetDlgItemTextV(JOBTITLE_STATIC, job->title);
	SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, idx, 0);
	SetDlgItemInt(BUFSIZE_EDIT, job->bufSize);
	::CheckDlgButton(hWnd, ESTIMATE_CHECK, job->estimateMode);
	::CheckDlgButton(hWnd, IGNORE_CHECK, job->ignoreErr);
	::CheckDlgButton(hWnd, FILTER_CHECK, job->isFilter);
	SetDlgItemTextV(SRC_COMBO, job->src);
	SetDlgItemTextV(DST_COMBO, job->dst);
	SetDlgItemTextV(INCLUDE_COMBO, job->includeFilter);
	SetDlgItemTextV(EXCLUDE_COMBO, job->excludeFilter);
	SetItemEnable(COPYINFO_LIST[idx].mode == FastCopy::DELETE_MODE);
	SetDlgItemText(PATH_EDIT, "");
	SetDlgItemText(ERR_EDIT, "");
	diskMode = job->diskMode;
	UpdateMenu();
	SetMiniWindow();
}

#if 1
void DBGWrite(char *fmt,...)
{
	static HANDLE	hDbgFile = INVALID_HANDLE_VALUE;

	if (hDbgFile == INVALID_HANDLE_VALUE)
		hDbgFile = ::CreateFile("c:\\fastcopy_dbg.txt", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0);

	char	buf[1024];
	va_list	va;
	va_start(va, fmt);
	DWORD	len = wvsprintf(buf, fmt, va);
	va_end(va);
	::WriteFile(hDbgFile, buf, len, &len, 0);
}
#endif


 

⌨️ 快捷键说明

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