📄 mainwin.cpp
字号:
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 + -