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

📄 filemgr.cpp

📁 远程控制系统,可以实现局域网内进行远程控制计算机,很方便,并且是学习用的非常好的资料.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

LRESULT CFileMgr::OnFileDelete(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	CString fileList;

	if (!GetSelectedFileName(fileList, true))
		return 0;

	if (MessageBox("确定要删除文件?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
		return 0;

	int b = 0, f = 0;

	for (;;)
	{
		f = fileList.Find('|', b);

		if (f == -1)
			break;

		SendCommand(FILEMGR_DELETEFILE, fileList.Mid(b, f - b));
		b = f + 1;
	}

	SetCurrentPath(szCurPath);

	return 0;
}

LRESULT CFileMgr::OnDirectoryCreate(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	CInputDlg<IDD_CREATEDIRECTORY> dlg;
	char szDirectoryName[INPUT_BUFFER_SIZE] = "";

	if (dlg.DoModal(m_hWnd, (LPARAM)szDirectoryName) == FALSE)
		return 0;

	CString path = szCurPath;
	path += "\\";
	path += szDirectoryName;
	SendCommand(FILEMGR_CREATEDIRECTORY, path);

	SetCurrentPath(szCurPath);

	return 0;
}

LRESULT CFileMgr::OnDirectoryRemove(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_hFileList.GetSelectedCount() != 1)
	{
		MessageBox("一次只能删除一个目录!", "错误", MB_ICONERROR);
		return 0;
	}

	int nItem = m_hFileList.SendMessage(LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));

	PFILE_LIST p = (PFILE_LIST)m_hFileList.GetItemData(nItem);

	if (!(p->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
		return 0;

	if (MessageBox("确定要删除目录?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
		return 0;

	CString path = szCurPath;
	path += "\\";
	path += p->fileinfo.FileName;
	SendCommand(FILEMGR_REMOVEDIRECTORY, path);

	SetCurrentPath(szCurPath);

	return 0;
}

LRESULT CFileMgr::OnGoto(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
	m_hPathList.GetWindowText(szCurPath, MAX_PATH);
	SetCurrentPath(szCurPath);

	return 0;
}

int CALLBACK CFileMgr::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	PFILE_LIST pfile1 = (PFILE_LIST)lParam1;
	PFILE_LIST pfile2 = (PFILE_LIST)lParam2;
	int nResult, nSortColumn = lParamSort < 0 ? ~lParamSort : lParamSort;

	if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
	{
		nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY);
		return lParamSort < 0 ? nResult : -nResult;
	}

	switch (nSortColumn)
	{
	case 0:
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName);
		break;

	case 1:
		if (pfile1->fileinfo.FileSizeHigh != pfile2->fileinfo.FileSizeHigh)
		{
			nResult = pfile1->fileinfo.FileSizeHigh - pfile2->fileinfo.FileSizeHigh;
			break;
		}
		if (pfile1->fileinfo.FileSizeLow != pfile2->fileinfo.FileSizeLow)
		{
			nResult = pfile1->fileinfo.FileSizeLow - pfile2->fileinfo.FileSizeLow;
			break;
		}
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName);
		break;

	case 2:
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY);
			break;
		}
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN);
			break;
		}
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM);
			break;
		}
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE);
			break;
		}
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED);
			break;
		}
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED))
		{
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED);
			break;
		}
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName);
		break;

	case 3:
		if (pfile1->fileinfo.LastWriteTime.dwHighDateTime != pfile2->fileinfo.LastWriteTime.dwHighDateTime)
		{
			nResult = pfile1->fileinfo.LastWriteTime.dwHighDateTime - pfile2->fileinfo.LastWriteTime.dwHighDateTime;
			break;
		}
		if (pfile1->fileinfo.LastWriteTime.dwLowDateTime != pfile2->fileinfo.LastWriteTime.dwLowDateTime)
		{
			nResult = pfile1->fileinfo.LastWriteTime.dwLowDateTime - pfile2->fileinfo.LastWriteTime.dwLowDateTime;
			break;
		}
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName);
		break;
	}

	return lParamSort < 0 ? -nResult : nResult;
}

void CFileMgr::ParseDataPack(LPBYTE pData, ULONG nDataSize)
{
	PNTSHELL_RESULTSET rs = (PNTSHELL_RESULTSET)pData;
	CString str;
	PBYTE p = pData + sizeof(NTSHELL_RESULTSET);
	ULONG l = nDataSize - sizeof(NTSHELL_RESULTSET);

	if (rs->ErrorCode != ERROR_SUCCESS)
	{
		LPVOID lpMsgBuf;

		FormatMessage(	FORMAT_MESSAGE_ALLOCATE_BUFFER |
						FORMAT_MESSAGE_FROM_SYSTEM |
						FORMAT_MESSAGE_IGNORE_INSERTS,
						NULL,
						rs->ErrorCode,
						0,
						(LPTSTR)&lpMsgBuf,
						0,
						NULL
						);

		MessageBox((LPTSTR)lpMsgBuf, "", MB_ICONERROR);
		LocalFree(lpMsgBuf);
		return;
	}

	if (rs->ResultClass == FILEMGR_LISTDRIVE)
	{
		int count = 0;
		PFILEMGR_DRIVEINFO pdi;

		m_hPathList.ResetContent();

		for (int i = 0; i < (int)rs->NumberOfResults; i++)
		{
			pdi = ((PFILEMGR_DRIVEINFO)p) + i;

			str.Format("%s (%c:)", pdi->VolumeName, pdi->RootPathName[0]);
			m_hPathList.InsertString(i, str);
			m_hPathList.SetItemData(i, pdi->RootPathName[0]);
		}

		char szRootPath[] = "C:\\";
		m_hPathList.SetCurSel(0);
		szRootPath[0] = (char)m_hPathList.GetItemData(0);
		m_hPathList.SetWindowText(szRootPath);
		SetCurrentPath(szRootPath);
	}
	else if (rs->ResultClass == FILEMGR_LISTFILE)
	{
		int count = 0;
		PFILEMGR_FILEINFO pfi;

		for (ULONG i = 0; i < l && count < (int)rs->NumberOfResults; count++)
		{
			pfi = (PFILEMGR_FILEINFO)(p + i);

			PFILE_LIST p = (PFILE_LIST)new BYTE[sizeof(FILE_LIST) + strlen(pfi->FileName) + 1];
			p->fileinfo = *pfi;
			strcpy(p->fileinfo.FileName, pfi->FileName);
			p->next = filelist;
			filelist = p;

			char *pExtName = strrchr(p->fileinfo.FileName, '.');
			int nImage = GetIconIndex(pExtName, TRUE, p->fileinfo.FileAttributes);
			m_hFileList.InsertItem(LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM, count, pfi->FileName, 0, 0, nImage, (LPARAM)p);

			if (!(pfi->FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
			{
				char buf[20];
				ULONG fsh = pfi->FileSizeHigh >> 10;
				ULONG fsl = (pfi->FileSizeLow >> 10) | (pfi->FileSizeHigh << 22);
				if (pfi->FileSizeLow % 1024) {fsl += 1; if (fsl == 0) fsh += 1;}
				NumGrouping(buf, fsh, fsl, 14);
				str = buf;
				str += " KB";
				m_hFileList.SetItemText(count, 1, str);
			}

			str = "";
			if (pfi->FileAttributes & FILE_ATTRIBUTE_READONLY)
				str += 'R';
			if (pfi->FileAttributes & FILE_ATTRIBUTE_HIDDEN)
				str += 'H';
			if (pfi->FileAttributes & FILE_ATTRIBUTE_SYSTEM)
				str += 'S';
			if (pfi->FileAttributes & FILE_ATTRIBUTE_ARCHIVE)
				str += 'A';
			if (pfi->FileAttributes & FILE_ATTRIBUTE_ENCRYPTED)
				str += 'E';
			if (pfi->FileAttributes & FILE_ATTRIBUTE_COMPRESSED)
				str += 'C';
			m_hFileList.SetItemText(count, 2, str);

			SYSTEMTIME stime;
			FILETIME ftime;
			FileTimeToLocalFileTime(&pfi->LastWriteTime, &ftime);
			FileTimeToSystemTime(&ftime, &stime);
			str.Format("%d-%02d-%02d %02d:%02d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);
			m_hFileList.SetItemText(count, 3, str);
			i += sizeof(FILEMGR_FILEINFO) + strlen(pfi->FileName) + 1;
		}

		m_hFileList.SortItems(CompareFunc, (LPARAM)SizeSortOrder[SortColumn]);
	}
	else if (rs->ResultClass == FILEMGR_SIMPLYREADFILE)
	{
		PFILEMGR_FILEREAD pfr = (PFILEMGR_FILEREAD)p;
		char szTempFile[MAX_PATH];

		GetTempPath(MAX_PATH, szTempFile);
		strcat(szTempFile, pfr->FileName);

		HANDLE hFile = CreateFile(szTempFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

		if (hFile != INVALID_HANDLE_VALUE)
		{
			for (ULONG i = 0; i < pfr->FileSize;)
			{
				ULONG nWriteBytes;
				if (!WriteFile(hFile, pfr->FileData + i, pfr->FileSize - i, &nWriteBytes, NULL))
					break;
				i += nWriteBytes;
			}

			CloseHandle(hFile);

//			STARTUPINFO si = {0};
//			PROCESS_INFORMATION pi;

//			si.cb			= sizeof(STARTUPINFO);
//			si.lpDesktop	= "WinSta0\\Default";
//			si.dwY			= 1;
//			si.dwXSize		= 100;
//			si.dwYSize		= 100;
//			si.wShowWindow	= SW_SHOWNORMAL;

//			if (!CreateProcess(szTempFile, pfr->cFileName, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
//			{
				if (!ShellExecute(NULL, "open", szTempFile, NULL, NULL, SW_SHOWNORMAL))
					MessageBox("文件已传送完成,但无法打开");
//			}
//			else
//			{
//				CloseHandle(pi.hProcess);
//				CloseHandle(pi.hThread);
//			}
		}
	}
}

void CFileMgr::NumGrouping(char *buf, unsigned int hival, unsigned int loval, int width)
{
	unsigned int c, d, i, temp;
	char *p;

	p = buf + width;
	*p = '\0';
	goto mod;
	do
	{
		if (i++ == 2)
		{
			*--p = ',';
mod:
			i = 0;
		}

		if (hival)
		{
			c = hival % 10;
			hival /= 10;
			c = (c << 16) + (loval >> 16);
			d = c / 10;
			c %= 10;
			c = (c << 16) + (loval & 0xffff);
			temp = c % 10;
			loval = (d << 16) + c / 10;
		}
		else
		{
			temp = (unsigned int)loval % 10;
			loval /= 10;
		}
		*--p = temp + '0';
	} while (loval || hival);

	while (p > buf)
		*--p = ' ';
}

void CFileMgr::CleanupFileList()
{
	m_hFileList.DeleteAllItems();

	while (filelist != NULL)
	{
		PFILE_LIST p = filelist;
		filelist = filelist->next;
		delete []p;
	}
}

int CFileMgr::GetIconIndex(const char *lpExtName, BOOL bSmallIcon, DWORD dwFileAttributes)
{
	SHFILEINFO shfi;
	int nImage;

	DWORD dwFlags = SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
	dwFlags |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;

	nImage = SHGetFileInfo(lpExtName, dwFileAttributes, &shfi, sizeof(SHFILEINFO), dwFlags);

	return shfi.iIcon;
}

void CFileMgr::SetCurrentPath(const char *lpPath)
{
	char szFilePath[280];

	if (lpPath[1] == ':')
	{
		strcpy(szCurPath, lpPath);
	}
	else if (lpPath[0] == '.' && lpPath[1] == '.')
	{
		char *p = strrchr(szCurPath, '\\');

		if (p - szCurPath > 3)
			p[0] = '\0';
		else
			p[1] = '\0';
	}
	else
	{
		if (strlen(szCurPath) > 3)
			strcat(szCurPath, "\\");
		strcat(szCurPath, lpPath);
	}

	CleanupFileList();

	strcpy(szFilePath, szCurPath);

	if (szCurPath[strlen(szCurPath) - 1] == '\\')
		strcat(szFilePath, "*.*");
	else
		strcat(szFilePath, "\\*.*");

	SendCommand(FILEMGR_LISTFILE, szFilePath);
	m_hPathList.SetWindowText(szCurPath);
}

int CFileMgr::SendCommand(DWORD dwCommand, const char *lpPath)
{
	NTSHELL_REQUEST req;

	req.ClientVersion = 1;
	req.Reserved = 0;
	req.RequestClass = (WORD)dwCommand;
	req.Reserved2 = 0;

	WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
	WriteBuffer(lpPath, strlen(lpPath) + 1);

	FlushBuffer();

	int ret = SendPack();

	if (ret == SOCKMGR_SOCK_FAILED)
		MessageBox("连接不可用", "错误", MB_ICONERROR);

	return ret;
}

int CFileMgr::SendCommandEx(DWORD dwCommand, const void *lpData, int cbData)
{
	NTSHELL_REQUEST req;

	req.ClientVersion = 1;
	req.Reserved = 0;
	req.RequestClass = (WORD)dwCommand;
	req.Reserved2 = 0;

	WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
	WriteBuffer((char *)lpData, cbData);

	FlushBuffer();

	int ret = SendPack();

	if (ret == SOCKMGR_SOCK_FAILED)
		MessageBox("连接不可用", "错误", MB_ICONERROR);

	return ret;
}

bool CFileMgr::GetSelectedFileName(CString &str, bool bIncludePath)
{
	int nItem = -1;

	str = "";

	for (;;)
	{
		nItem = m_hFileList.SendMessage(LVM_GETNEXTITEM, (WPARAM)nItem, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));

		if (nItem == -1)
			break;

		PFILE_LIST p = (PFILE_LIST)m_hFileList.GetItemData(nItem);

		if (p->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			continue;

		if (bIncludePath)
		{
			str += szCurPath;
			str += "\\";
		}

		str += p->fileinfo.FileName;
		str += "|";
	}

	return true;
}

⌨️ 快捷键说明

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