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