📄 copydlg.cpp
字号:
//CopyDlg.cpp
#include "GSFinder.h"
#include "CopyDlg.h"
#define ID_THREAD_COPY 1
CCopyFileDlg* pcfd;
////////////////////////////////////////////////////////////////
typedef struct _tagCopyThread
{
int m_nCount;
BOOL* m_pbCancel;
BOOL m_bFileMove;
LISTITEMINFO* m_lpliinfo;
LPCTSTR m_lpszFolderFrom;
LPCTSTR m_lpszFolderTo;
HWND m_hWnd;
}COPYTHREAD;
////////////////////////////////////////////////////////////////
CCopyFileDlg::CCopyFileDlg()
{
m_nCount = 0;
m_bCancel = FALSE;
m_bFileMove = FALSE;
m_lpliinfo = NULL;
m_lpszFolderFrom = NULL;
m_lpszFolderTo = NULL;
m_hWnd = NULL;
m_bTimerReset = TRUE; //ADD TODA (from GSFinder ver.1.99)
}
////////////////////////////////////////////////////////////////
BOOL CopyFileWithMessage(LPCTSTR lpszPathFrom, LPCTSTR lpszPathTo, int* lpOverWrite, HWND hDlg, BOOL bFileMove)
{
//忣曬傪昞帵
LPTSTR lpszFileName = wcsrchr(lpszPathFrom, _T('\\'));
if (!lpszFileName)
lpszFileName = (LPTSTR)lpszPathFrom;
else
++lpszFileName;
SetWindowText(GetDlgItem(hDlg, IDC_FILE_NAME), lpszFileName);
WIN32_FIND_DATA finddata;
HANDLE hFind = FindFirstFile(lpszPathTo, &finddata);
if (hFind != INVALID_HANDLE_VALUE){
FindClose(hFind);
//僼傽僀儖偑懚嵼
if (*lpOverWrite == RETCODE_YES || *lpOverWrite == RETCODE_NO)
{
SendMessage(hDlg, WM_SHOWOWMSG, (WPARAM)lpszPathTo, (LPARAM)lpszPathFrom);
*lpOverWrite = pcfd->m_nRetCode;
}
if (*lpOverWrite == RETCODE_YES || *lpOverWrite == RETCODE_ALL_YES)
{
if (bFileMove)
{
SetFileAttributes(lpszPathTo, FILE_ATTRIBUTE_NORMAL);
if (!DeleteFile(lpszPathTo))
return FALSE;
if (!MoveFile(lpszPathFrom, lpszPathTo))
return FALSE;
}
else
{
SetFileAttributes(lpszPathTo, FILE_ATTRIBUTE_NORMAL);
if (!CopyFile(lpszPathFrom, lpszPathTo, FALSE))
return FALSE;
}
}
}
else
{
if (bFileMove)
{
if (!MoveFile(lpszPathFrom, lpszPathTo))
return FALSE;
}
else
{
if (!CopyFile(lpszPathFrom, lpszPathTo, FALSE))
return FALSE;
}
}
TCHAR szTemp[32];
pcfd->m_nExecCount += 1;
wsprintf(szTemp, _T("%d/%d"), pcfd->m_nExecCount, pcfd->m_nFileCount);
::SetWindowText(GetDlgItem(hDlg, IDC_PROG_TEXT), szTemp);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS), PBM_SETPOS, pcfd->m_nExecCount, 0);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL CopyFolder(LPCTSTR lpszPathFrom, LPCTSTR lpszPathTo, BOOL* lpCancelMode, int* lpOverWrite, HWND hDlg, BOOL bFileMove)
{
//忣曬傪昞帵
LPTSTR lpszFileName = wcsrchr(lpszPathFrom, _T('\\'));
if (!lpszFileName)
lpszFileName = (LPTSTR)lpszPathFrom;
else
++lpszFileName;
SetWindowText(GetDlgItem(hDlg, IDC_FILE_NAME), lpszFileName);
//怴偟偔僼僅儖僟傪嶌惉
if (!CreateDirectory(lpszPathTo, NULL))
{
//偙偙偵僼僅儖僟偺忋彂偒妋擣傪婰弎
if (*lpOverWrite == RETCODE_YES || *lpOverWrite == RETCODE_NO)
{
SendMessage(hDlg, WM_SHOWFOLDEROWMSG, (WPARAM)lpszPathTo, 0);
int nRet = pcfd->m_nRetCode;
if (nRet == IDCANCEL)
return TRUE;
}
if (*lpOverWrite == RETCODE_ALL_NO)
return TRUE;
}
//堏摦尦僼僅儖僟撪偺僼傽僀儖傪専嶕
TCHAR szTemp[MAX_PATH+4];
wsprintf(szTemp, _T("%s\\*.*"), lpszPathFrom);
WIN32_FIND_DATA finddata;
HANDLE hFind = FindFirstFile(szTemp, &finddata);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if (*lpCancelMode)
{
FindClose(hFind);
return TRUE;
}
if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//僼僅儖僟
LPTSTR lpszFrom = new TCHAR[wcslen(lpszPathFrom)+wcslen(finddata.cFileName)+2];
LPTSTR lpszTo = new TCHAR[wcslen(lpszPathTo)+wcslen(finddata.cFileName)+2];
wsprintf(lpszFrom, _T("%s\\%s"), lpszPathFrom, finddata.cFileName);
wsprintf(lpszTo, _T("%s\\%s"), lpszPathTo, finddata.cFileName);
if (!CopyFolder(lpszFrom, lpszTo, lpCancelMode, lpOverWrite, hDlg, bFileMove))
{
FindClose(hFind);
delete[] lpszFrom;
delete[] lpszTo;
return FALSE;
}
delete[] lpszFrom;
delete[] lpszTo;
}else
{
//僼傽僀儖
LPTSTR lpszFrom = new TCHAR[wcslen(lpszPathFrom)+wcslen(finddata.cFileName)+2];
LPTSTR lpszTo = new TCHAR[wcslen(lpszPathTo)+wcslen(finddata.cFileName)+2];
wsprintf(lpszFrom, _T("%s\\%s"), lpszPathFrom, finddata.cFileName);
wsprintf(lpszTo, _T("%s\\%s"), lpszPathTo, finddata.cFileName);
if (!CopyFileWithMessage(lpszFrom, lpszTo, lpOverWrite, hDlg, bFileMove))
{
FindClose(hFind);
delete[] lpszFrom;
delete[] lpszTo;
return FALSE;
}
delete[] lpszFrom;
delete[] lpszTo;
}
}
while (FindNextFile(hFind, &finddata));
FindClose(hFind);
}
if (bFileMove)
RemoveDirectory(lpszPathFrom);
pcfd->m_nExecCount += 1;
wsprintf(szTemp, _T("%d/%d"), pcfd->m_nExecCount, pcfd->m_nFileCount);
::SetWindowText(GetDlgItem(hDlg, IDC_PROG_TEXT), szTemp);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS), PBM_SETPOS, pcfd->m_nExecCount, 0);
return TRUE;
}
////////////////////////////////////////////////////////////////
DWORD WINAPI CopyFileThread(LPVOID pParam)
{
COPYTHREAD* pct = (COPYTHREAD*)pParam;
int nOverWrite = RETCODE_YES;
//DEL START TODA
// //昞帵偺峏怴
// TCHAR szTemp[MAX_PATH+4];
// TCHAR szFrom[MAX_PATH];
// TCHAR szTo[MAX_PATH];
// LPTSTR lpszTemp = wcsrchr(pct->m_lpszFolderFrom, _T('\\'));
// if (lpszTemp)
// wcscpy(szFrom, ++lpszTemp);
// else
// wcscpy(szFrom, _T("\\"));
//
// lpszTemp = wcsrchr(pct->m_lpszFolderTo, _T('\\'));
// if (lpszTemp)
// wcscpy(szTo, ++lpszTemp);
// else
// wcscpy(szTo, _T("\\"));
//
// wsprintf(szTemp, IDS_FMT_FROMTO, szFrom, szTo);
// SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FOLDER), szTemp);
//DEL END
//僐僺乕張棟奐巒
UINT nFileCount = 0;
for (int i=0; i<pct->m_nCount; i++)
{
//僉儍儞僙儖僠僃僢僋
if (*pct->m_pbCancel)
{
::SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FILE_NAME), IDS_MSG_CANCELED);
::SendMessage(pct->m_hWnd, WM_DLGCLOSE, 0, 0);
ExitThread(0);
return 0;
}
//ADD START TODA
//昞帵偺峏怴
TCHAR szTemp[MAX_PATH+4];
TCHAR szFrom[MAX_PATH];
TCHAR szTo[MAX_PATH];
LPTSTR lpszTemp = wcsrchr(pct->m_lpliinfo[i].szPath, _T('\\'));
if (lpszTemp)
wcscpy(szFrom, ++lpszTemp);
else
wcscpy(szFrom, _T("\\"));
lpszTemp = wcsrchr(pct->m_lpszFolderTo, _T('\\'));
if (lpszTemp)
wcscpy(szTo, ++lpszTemp);
else
wcscpy(szTo, _T("\\"));
wsprintf(szTemp, IDS_FMT_FROMTO, szFrom, szTo);
SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FOLDER), szTemp);
//ADD END
//MOD START TODA (pct->m_lpszFolderFrom -> pct->m_lpliinfo[i].szPath)
// 僼傽僀儖柤偺愝掕
wsprintf(szFrom, _T("%s\\%s"), pct->m_lpliinfo[i].szPath, pct->m_lpliinfo[i].szName);
if (wcscmp(pct->m_lpliinfo[i].szPath, pct->m_lpszFolderTo) == 0)
{
// 僐僺乕尦偲僐僺乕愭偑摨偠
wsprintf(szTo, IDS_FMT_COPY_NAME1, pct->m_lpszFolderTo, pct->m_lpliinfo[i].szName);
if (GetFileAttributes(szTo) != 0xFFFFFFFF)
{
for (int n = 2; n < 512; n++) //MOD START TODA (from GSFinder ver.1.99)
{
wsprintf(szTo, IDS_FMT_COPY_NAME2, pct->m_lpszFolderTo, n, pct->m_lpliinfo[i].szName);
if (GetFileAttributes(szTo) == 0xFFFFFFFF)
break;
}
}
}
//MOD END
else
wsprintf(szTo, _T("%s\\%s"), pct->m_lpszFolderTo, pct->m_lpliinfo[i].szName);
//幚嵺偺僐僺乕張棟
if (pct->m_lpliinfo[i].nItem == LIST_ITEM_FOLDER)
{
//僼僅儖僟偺僐僺乕
if (!CopyFolder(szFrom, szTo, pct->m_pbCancel, &nOverWrite, pct->m_hWnd, pct->m_bFileMove))
{
SendMessage(pct->m_hWnd, WM_SHOWERRMSG, (WPARAM)pct->m_lpliinfo[i].szName, 0);
::SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FILE_NAME), IDS_MSG_CANCELED);
::SendMessage(pct->m_hWnd, WM_DLGCLOSE, 0, 0);
ExitThread(0);
return 0;
}
}
else if (pct->m_lpliinfo[i].nItem == LIST_ITEM_FILE)
{
//僼傽僀儖偺僐僺乕
if (!CopyFileWithMessage(szFrom, szTo, &nOverWrite, pct->m_hWnd, pct->m_bFileMove))
{
SendMessage(pct->m_hWnd, WM_SHOWERRMSG, (WPARAM)pct->m_lpliinfo[i].szName, 0);
::SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FILE_NAME), IDS_MSG_CANCELED);
::SendMessage(pct->m_hWnd, WM_DLGCLOSE, 0, 0);
ExitThread(0);
return 0;
}
}
if (nOverWrite == RETCODE_ALL_NO)
{
::SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FILE_NAME), IDS_MSG_CANCELED);
::SendMessage(pct->m_hWnd, WM_DLGCLOSE, 0, 0);
ExitThread(0);
return 0;
}
}
::SetWindowText(GetDlgItem(pct->m_hWnd, IDC_FILE_NAME), IDS_MSG_DONE);
::SendMessage(pct->m_hWnd, WM_DLGCLOSE, 0, 0);
ExitThread(0);
return 0;
}
////////////////////////////////////////////////////////////////
void CCopyFileDlg::OnInitDialog(HWND hDlg)
{
TCHAR szTemp[32];
m_bCancel = FALSE;
m_nExecCount = 0;
m_hWnd = hDlg;
CenterWindow(hDlg);
if (m_bFileMove)
{
SetWindowText(hDlg, IDS_MSG_MOVING);
SetWindowText(GetDlgItem(hDlg, IDC_FILE_NAME), IDS_MSG_PREP_MOVE);
}
else
{
SetWindowText(hDlg, IDS_MSG_COPYING);
SetWindowText(GetDlgItem(hDlg, IDC_FILE_NAME), IDS_MSG_PREP_COPY);
}
m_nFileCount = GetFileAndFolderCount(m_lpszFolderFrom, m_lpliinfo, m_nCount);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS), PBM_SETRANGE, 0, MAKELPARAM(0, m_nFileCount));
wsprintf(szTemp, _T("0/%d"), m_nFileCount);
SetWindowText(GetDlgItem(hDlg, IDC_PROG_TEXT), szTemp);
ShowWindow(hDlg, SW_SHOW);
static COPYTHREAD CopyThread;
CopyThread.m_nCount = m_nCount;
CopyThread.m_pbCancel = &m_bCancel;
CopyThread.m_bFileMove = m_bFileMove;
CopyThread.m_lpliinfo = m_lpliinfo;
CopyThread.m_lpszFolderFrom = m_lpszFolderFrom;
CopyThread.m_lpszFolderTo = m_lpszFolderTo;
CopyThread.m_hWnd = m_hWnd;
#ifndef __WCEEMULATION
m_hThread = CreateThread(NULL, 0, CopyFileThread, (LPVOID)&CopyThread, 0, &m_dwThreadID);
#else
EndDialog(hDlg, 0);
#endif
}
////////////////////////////////////////////////////////////////
LRESULT CALLBACK CopyFileDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -