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

📄 copydlg.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//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 + -