Files
SimpleRemoter/server/2015Remote/file/CFileManagerDlg.cpp

2490 lines
86 KiB
C++
Raw Normal View History

// FileManagerDlg.cpp : implementation file
#include "stdafx.h"
#include "2015Remote.h"
#include "CFileManagerDlg.h"
#include "CFileTransferModeDlg.h"
#include "InputDlg.h"
#include <windows.h>
#include <Shlwapi.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32))
static UINT indicators[] = {
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,
ID_SEPARATOR
};
/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg dialog
using namespace file;
CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext)
: DialogBase(CFileManagerDlg::IDD, pParent, pIOCPServer, pContext, IDI_File)
{
m_ProgressCtrl = nullptr;
m_SearchStr = _T("");
m_bSubFordle = FALSE;
id_search_result = 0;
// 保存远程驱动器列表
m_bCanAdmin = (*m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)) == 0x01;
m_strDesktopPath = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(2);
memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList));
memcpy(m_bRemoteDriveList, m_ContextObject->m_DeCompressionBuffer.GetBuffer(1 + 1 + (m_strDesktopPath.GetLength() + 1) * sizeof(TCHAR)),
m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1 - 1 - (m_strDesktopPath.GetLength() + 1) * sizeof(TCHAR));
m_bUseAdmin = false;
m_hFileSend = INVALID_HANDLE_VALUE;
m_hFileRecv = INVALID_HANDLE_VALUE;
m_nTransferMode = TRANSFER_MODE_NORMAL;
m_nOperatingFileLength = 0;
m_nCounter = 0;
m_bIsStop = false;
DRIVE_Sys = FALSE;
DRIVE_CAZ = FALSE;
Bf_nCounters = 0;// 备份计数器 由于比较用
Bf_dwOffsetHighs = 0;
Bf_dwOffsetLows = 0;
m_bDragging = FALSE;
}
void CFileManagerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox);
DDX_Control(pDX, IDC_LIST_REMOTE, m_list_remote);
DDX_Control(pDX, IDC_LIST_REMOTE_DRIVER, m_list_remote_driver);
DDX_Control(pDX, IDC_BTN_SEARCH, m_BtnSearch);
DDX_Text(pDX, IDC_EDT_SEARCHSTR, m_SearchStr);
DDX_Check(pDX, IDC_CK_SUBFORDLE, m_bSubFordle);
DDX_Control(pDX, IDC_LIST_REMOTE_SEARCH, m_list_remote_search);
}
BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog)
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE_DRIVER, OnDblclkListRemotedriver) //主1 双击
ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote) //主 双击
ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_DRIVER, OnRclickListRemotedriver) //主1 右键
ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote) //主 右键
ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_SEARCH, OnRclickListSearch) //搜索 右键
ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_DRIVER, OnclkListRemotedriver) //主1 单击
ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE, OnclkListRemote) //主 单击
ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_SEARCH, OnclickListSearch) //搜索 单击
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_REMOTE, OnEndLabelEditListRemote)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_REMOTE, OnBeginDragListRemote)
ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView) //显示方式
ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev) //向上
ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop) //取消
ON_BN_CLICKED(IDC_BUTTON_GO, OnGo)
ON_COMMAND(IDM_RENAME, OnRename)
ON_COMMAND(IDM_DELETE, OnDelete)
ON_COMMAND(IDM_DELETE_ENFORCE, OnDeleteEnforce)
ON_COMMAND(IDM_NEWFOLDER, OnNewFolder)
ON_COMMAND(IDM_USE_ADMIN, OnUseAdmin)
ON_COMMAND(IDM_REMOTE_OPEN_SHOW, OnRemoteOpenShow)
ON_COMMAND(IDM_REMOTE_OPEN_HIDE, OnRemoteOpenHide)
ON_COMMAND(IDM_GET_FILEINFO, OnRemoteInfo)
ON_COMMAND(ID_FILEMANGER_Encryption, OnRemoteEncryption)
ON_COMMAND(ID_FILEMANGER_decrypt, OnRemoteDecrypt)
ON_COMMAND(ID_FILEMANGER_COPY, OnRemoteCopyFile)
ON_COMMAND(ID_FILEMANGER_PASTE, OnRemotePasteFile)
ON_COMMAND(ID_FILEMANGER_ZIP, OnRemotezip)
ON_COMMAND(ID_FILEMANGER_ZIP_STOP, OnRemotezipstop)
ON_COMMAND(IDM_COMPRESS, OnCompress)
ON_COMMAND(IDM_UNCOMPRESS, OnUncompress)
ON_COMMAND(IDM_REFRESH, OnRefresh)
ON_COMMAND(IDM_TRANSFER_S, OnTransferSend)
ON_COMMAND(IDM_TRANSFER_R, OnTransferRecv)
ON_CBN_SETFOCUS(IDC_REMOTE_PATH, OnSetfocusRemotePath)
ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch)
ON_BN_CLICKED(ID_SEARCH_STOP, OnBnClickedSearchStop)
ON_BN_CLICKED(ID_SEARCH_RESULT, OnBnClickedSearchResult)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg message handlers
BOOL CFileManagerDlg::MyShell_GetImageLists()
{
I_ImageList0.DeleteImageList();
I_ImageList0.Create(32, 32, ILC_COLOR32 | ILC_MASK, 2, 2);
I_ImageList0.SetBkColor(::GetSysColor(COLOR_BTNFACE));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_A));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_C));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_D));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_E));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_F));
I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_G));
I_ImageList1.DeleteImageList();
I_ImageList1.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
I_ImageList1.SetBkColor(::GetSysColor(COLOR_BTNFACE));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_A));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_C));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_D));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_E));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_F));
I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_G));
m_list_remote_driver.SetImageList(&I_ImageList0, LVSIL_NORMAL);
m_list_remote_driver.SetImageList(&I_ImageList1, LVSIL_SMALL);
return TRUE;
}
BOOL CFileManagerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
RECT rect;
GetClientRect(&rect);
// 设置标题
CString str;
str.Format(_T("文件管理 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str);
// 创建带进度条的状态栏
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators) / sizeof(UINT))) {
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL);
m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_NORMAL, 100);
m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 210);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏
m_wndStatusBar.GetItemRect(1, &rect);
m_ProgressCtrl = new CProgressCtrl;
m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, rect, &m_wndStatusBar, 1);
m_ProgressCtrl->SetRange(0, 100); //设置进度条范围
m_ProgressCtrl->SetPos(0); //设置进度条当前位置
SHAutoComplete(GetDlgItem(IDC_REMOTE_PATH)->GetWindow(GW_CHILD)->m_hWnd, SHACF_FILESYSTEM);
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
MyShell_GetImageLists();
m_list_remote_driver.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS);
m_list_remote.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS);
m_list_remote_search.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS);
m_list_remote.SetImageList(&(THIS_APP->m_pImageList_Large), LVSIL_NORMAL);
m_list_remote.SetImageList(&(THIS_APP->m_pImageList_Small), LVSIL_SMALL);
m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Large), LVSIL_NORMAL);
m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Small), LVSIL_SMALL);
m_list_remote_driver.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 50);
m_list_remote_driver.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 38);
m_list_remote_driver.InsertColumn(2, _T("总大小"), LVCFMT_LEFT, 70);
m_list_remote_driver.InsertColumn(3, _T("可用空间"), LVCFMT_LEFT, 70);
m_list_remote.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 250);
m_list_remote.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 70);
m_list_remote.InsertColumn(2, _T("类型"), LVCFMT_LEFT, 120);
m_list_remote.InsertColumn(3, _T("修改日期"), LVCFMT_LEFT, 115);
m_list_remote.SetParenDlg(this);
//设置搜索list表头
m_list_remote_search.ShowWindow(SW_HIDE);
m_list_remote_search.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 130);
m_list_remote_search.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 100);
m_list_remote_search.InsertColumn(2, _T("修改日期"), LVCFMT_LEFT, 100);
m_list_remote_search.InsertColumn(3, _T("文件路径"), LVCFMT_LEFT, 450);
SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE);
FixedRemoteDriveList();
return TRUE;
}
void CFileManagerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
// 状态栏还没有创建
if (m_wndStatusBar.m_hWnd == NULL)
return;
// 定位状态栏
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏
RECT rect;
m_wndStatusBar.GetItemRect(1, &rect);
m_ProgressCtrl->MoveWindow(&rect);
}
void CFileManagerDlg::OnBeginDragListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//We will call delete later (in LButtonUp) to clean this up
if (m_list_remote.GetSelectedCount() > 1) //选择了列表中的超过 1 个项目
m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG);
else
m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG);
ASSERT(m_hCursor);
m_bDragging = TRUE;
SetCapture();
*pResult = 0;
}
void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bDragging) {
m_bDragging = FALSE;
BOOL bDownload = FALSE;
SetCursor(LoadCursor(NULL, IDC_NO));
TCHAR str[1024] = TEXT("c:\\");
HWND hwnd = NULL;
POINT pNow = { 0,0 };
if (GetCursorPos(&pNow)) // 获取鼠标当前位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, pNow.x, pNow.y, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, pNow.x, pNow.y, 0, 0);
Sleep(150);
HWND hwndPointNow = NULL;
hwndPointNow = ::WindowFromPoint(pNow); // 获取鼠标所在窗口的句柄
TCHAR szBuf_class[MAX_PATH];
TCHAR szBuf_title[MAX_PATH];
::GetWindowText(hwndPointNow, szBuf_title, MAX_PATH);
GetClassName(hwndPointNow, szBuf_class, MAX_PATH);
if ((lstrcmp(szBuf_class, _T("SysListView32")) == 0) && (lstrcmp(szBuf_title, _T("FolderView")) == 0)) {
TCHAR DeskTopPath[255];
SHGetSpecialFolderPath(0, DeskTopPath, CSIDL_DESKTOPDIRECTORY, 0);
strLpath = DeskTopPath;
bDownload = TRUE;
} else {
GetClassName(hwndPointNow, szBuf_class, MAX_PATH);
if ((lstrcmp(szBuf_class, _T("DirectUIHWND")) == 0)) {
hwnd = ::FindWindowEx(NULL, NULL, TEXT("CabinetWClass"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("WorkerW"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ComboBoxEx32"), NULL); //XP
if (hwnd == NULL) {
hwnd = ::FindWindowEx(NULL, NULL, TEXT("CabinetWClass"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("WorkerW"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("Address Band Root"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("msctls_progress32"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("Breadcrumb Parent"), NULL);
hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ToolbarWindow32"), NULL);
}
if (hwnd == NULL) {
::MessageBox(NULL, _T("请拖拽到文件管理器选定目录中"), TEXT("错误"), 0);
} else {
::SendMessage(hwnd, WM_GETTEXT, 1024, (LPARAM)str);
strLpath = str + 4;
bDownload = TRUE;
}
}
}
if (bDownload) {
m_bIsUpload = false;
// 禁用文件管理窗口
EnableControl(FALSE);
CString file;
m_Remote_Download_Job.RemoveAll();
POSITION pos = m_list_remote.GetFirstSelectedItemPosition();
while (pos) {
int nItem = m_list_remote.GetNextSelectedItem(pos);
file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
// 如果是目录
if (m_list_remote.GetItemData(nItem))
file += '\\';
m_Remote_Download_Job.AddTail(file);
}
if (file.IsEmpty()) {
EnableControl(TRUE);
::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
if (strLpath == _T("")) {
EnableControl(TRUE);
return;
}
if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\'))
strLpath += _T("\\");
m_nTransferMode = TRANSFER_MODE_NORMAL;
// 发送第一个下载任务
SendDownloadJob();
}
}
CDialog::OnLButtonUp(nFlags, point);
}
BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN) {
if (pMsg->wParam == VK_ESCAPE)
return true;
if (pMsg->wParam == VK_RETURN) {
if (pMsg->hwnd == m_list_remote.m_hWnd ||
pMsg->hwnd == ((CEdit*)m_Remote_Directory_ComboBox.GetWindow(GW_CHILD))->m_hWnd) {
GetRemoteFileList();
}
return TRUE;
}
}
// 单击除了窗口标题栏以外的区域使窗口移动
if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd) {
pMsg->message = WM_NCLBUTTONDOWN;
pMsg->wParam = HTCAPTION;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_ProgressCtrl->StepIt();
CDialog::OnTimer(nIDEvent);
}
void CFileManagerDlg::FixedRemoteDriveList()
{
// 加载系统统图标列表 设置驱动器图标列表
//加载系统图标
DRIVE_Sys = FALSE;
BYTE* pDrive = NULL;
pDrive = (BYTE*)m_bRemoteDriveList;
int count = 0;
int AmntMB = 0; // 总大小
int FreeMB = 0; // 剩余空间
/*
6 DRIVE_FLOPPY
7 DRIVE_REMOVABLE
8 DRIVE_FIXED
9 DRIVE_REMOTE
10 DRIVE_REMOTE_DISCONNECT
11 DRIVE_CDROM
*/
int nIconIndex = -1;
//用一个循环遍历所有发送来的信息,先是到列表中
for (int i = 0; pDrive[i] != '\0';) {
//由驱动器名判断图标的索引
if (pDrive[i] == _T('A') || pDrive[i] == _T('B')) {
nIconIndex = 0;
} else {
switch (pDrive[i + 2]) {
case DRIVE_REMOVABLE:
nIconIndex = 3;
break;
case DRIVE_FIXED:
if (!DRIVE_Sys) {
DRIVE_Sys = TRUE;
nIconIndex = 1;
} else
nIconIndex = 2;
break;
case DRIVE_REMOTE:
nIconIndex = 4;
break;
case DRIVE_CDROM:
nIconIndex = 5;
break;
default:
nIconIndex = 2;
break;
}
}
//显示驱动器名
CString str;
str.Format(_T("%c:\\"), pDrive[i]);
int nItem = m_list_remote_driver.InsertItem(i, str, nIconIndex);
m_list_remote_driver.SetItemData(nItem, 1);
//显示驱动器大小
memcpy(&AmntMB, pDrive + i + 4, 4);
memcpy(&FreeMB, pDrive + i + 8, 4);
str.Format(_T("%0.1f GB"), (float)AmntMB / 1024);
m_list_remote_driver.SetItemText(nItem, 2, str);
str.Format(_T("%0.1f GB"), (float)FreeMB / 1024);
m_list_remote_driver.SetItemText(nItem, 3, str);
i += 12;
TCHAR* lpFileSystemName = NULL;
TCHAR* lpTypeName = NULL;
lpTypeName = (TCHAR*)(pDrive + i);
i += (lstrlen(lpTypeName) + 1) * sizeof(TCHAR);
lpFileSystemName = (TCHAR*)(pDrive + i);
// 磁盘类型, 为空就显示磁盘名称
if (lstrlen(lpFileSystemName) == 0) {
m_list_remote_driver.SetItemText(nItem, 1, lpTypeName);
} else {
m_list_remote_driver.SetItemText(nItem, 1, lpFileSystemName);
}
i += (lstrlen(lpFileSystemName) + 1) * sizeof(TCHAR);
count++;
}
m_list_remote_driver.InsertItem(0, _T("桌面"), nIconIndex);
m_list_remote_driver.InsertItem(0, _T("最近"), nIconIndex);
count += 2;
// 重置远程当前路径
m_Remote_Path = "";
m_Remote_Directory_ComboBox.ResetContent();
DRIVE_CAZ = FALSE;
DWORD_PTR dwResult;
ShowMessage(_T("远程计算机:磁盘列表"));
SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
BYTE bPacket = COMMAND_FILE_GETNETHOOD;
m_ContextObject->Send2Client(&bPacket, 1);
}
void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize)
{
CString str;
TCHAR* pszFileName = NULL;
int strsize;
DWORD dwOffset = 0; // 位移指针
for (int i = 0; dwOffset < buffersize - sizeof(int);) {
memcpy(&strsize, pbuffer + dwOffset, sizeof(int));
pszFileName = (TCHAR*)(pbuffer + dwOffset + sizeof(int));
str = pszFileName;
int nItem = m_list_remote_driver.InsertItem(m_list_remote_driver.GetItemCount(), str, DRIVE_REMOTE);
m_list_remote_driver.SetItemData(nItem, 1);
m_list_remote_driver.SetItemText(nItem, 1, _T("共享"));
m_list_remote_driver.SetItemText(nItem, 2, _T(""));
m_list_remote_driver.SetItemText(nItem, 3, _T(""));
dwOffset += (strsize + sizeof(int));
}
}
void CFileManagerDlg::OnClose()
{
CancelIO();
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
}
DestroyCursor(m_hCursor);
if (m_hFileSend != INVALID_HANDLE_VALUE) {
SAFE_CLOSE_HANDLE(m_hFileSend);
m_hFileSend = INVALID_HANDLE_VALUE;
}
if (m_hFileRecv != INVALID_HANDLE_VALUE) {
SAFE_CLOSE_HANDLE(m_hFileRecv);
m_hFileRecv = INVALID_HANDLE_VALUE;
}
int iImageCount = I_ImageList0.GetImageCount();
for (int i = 0; i < iImageCount; i++) {
I_ImageList0.Remove(-1);
}
iImageCount = I_ImageList1.GetImageCount();
for (int i = 0; i < iImageCount; i++) {
I_ImageList1.Remove(-1);
}
m_wndStatusBar.DestroyWindow();
m_ProgressCtrl->DestroyWindow();
SAFE_DELETE(m_ProgressCtrl);
DialogBase::OnClose();
}
CString CFileManagerDlg::GetParentDirectory(CString strPath)
{
CString strCurPath = strPath;
int Index = strCurPath.ReverseFind(_T('\\'));
if (Index == -1) {
return strCurPath;
}
CString str = strCurPath.Left(Index);
Index = str.ReverseFind(_T('\\'));
if (Index == -1) {
strCurPath = _T("");
return strCurPath;
}
strCurPath = str.Left(Index);
if (strCurPath.Right(1) != _T("\\"))
strCurPath += _T("\\");
return strCurPath;
}
void CFileManagerDlg::OnReceiveComplete()
{
if (m_bIsClosed) return;
switch (m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[0]) {
case TOKEN_FILE_LIST: // 文件列表
FixedRemoteFileList(m_ContextObject->m_DeCompressionBuffer.GetBuffer(0), m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1);
break;
case TOKEN_FILE_SIZE: // 传输文件时的第一个数据包,文件大小,及文件名
CreateLocalRecvFile();
break;
case TOKEN_FILE_DATA: // 文件内容
WriteLocalRecvFile();
break;
case TOKEN_TRANSFER_FINISH: // 传输完成
EndLocalRecvFile();
break;
case TOKEN_CREATEFOLDER_FINISH:
GetRemoteFileList(_T("."));
break;
case TOKEN_DELETE_FINISH:
EndRemoteDeleteFile();
break;
case TOKEN_GET_TRANSFER_MODE: //文件上传
SendTransferMode();
break;
case TOKEN_DATA_CONTINUE:
SendFileData(); //文件上传数据
break;
case TOKEN_RENAME_FINISH:
// 刷新远程文件列表
GetRemoteFileList(_T("."));
break;
case TOKEN_SEARCH_FILE_LIST:
FixedRemoteSearchFileList
(
m_ContextObject->m_DeCompressionBuffer.GetBuffer(0),
m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1
);
break;
case TOKEN_SEARCH_FILE_FINISH:
SearchEnd();
break;
case TOKEN_COMPRESS_FINISH:
GetRemoteFileList(_T("."));
break;
case TOKEN_FILE_GETNETHOOD:
fixNetHood(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1), m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1);
break;
case TOKEN_FILE_RECENT: {
CString strRecent = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1);
m_Remote_Directory_ComboBox.SetWindowText(strRecent);
m_list_remote.SetSelectionMark(-1);
GetRemoteFileList();
}
break;
case TOKEN_FILE_INFO: {
CString szInfo = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1);
if (MessageBox(szInfo, _T("路径 确认拷贝到剪切板"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) {
CStringA a;
a = szInfo;
::OpenClipboard(::GetDesktopWindow());
::EmptyClipboard();
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, a.GetLength() + 1);
if (hglbCopy != NULL) {
// Lock the handle and copy the text to the buffer.
LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
memcpy(lptstrCopy, a.GetBuffer(), a.GetLength() + 1);
GlobalUnlock(hglbCopy); // Place the handle on the clipboard.
SetClipboardData(CF_TEXT, hglbCopy);
GlobalFree(hglbCopy);
}
CloseClipboard();
}
}
break;
case TOKEN_FILE_REFRESH: {
GetRemoteFileList(_T("."));
}
break;
case TOKEN_FILE_ZIPOK: {
GetRemoteFileList(_T("."));
ShowMessage(_T("压缩完成"));
MessageBox(0, _T("ZIP压缩完成"));
}
break;
case TOKEN_FILE_GETINFO: {
}
break;
case TOKEN_FILE_SEARCHPLUS_LIST:
ShowSearchPlugList();
break;
case TOKEN_FILE_SEARCHPLUS_NONTFS: {
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,(LPARAM)_T(" 驱动盘非NTFS格式"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
break;
case TOKEN_FILE_SEARCHPLUS_HANDLE: {
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("需要管理员权限运行"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
break;
case TOKEN_FILE_SEARCHPLUS_INITUSN: {
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("初始化日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
break;
case TOKEN_FILE_SEARCHPLUS_GETUSN: {
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("获取日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
break;
case TOKEN_FILE_SEARCHPLUS_NUMBER: {
DWORD_PTR dwResult;
int i;
memcpy(&i, m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1, sizeof(int));
CString strMsgShow;
strMsgShow.Format(_T("已经搜索 %d 请勿再次搜索"), i);
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
break;
default:
SendException();
break;
}
}
void CFileManagerDlg::OnReceive()
{
}
void CFileManagerDlg::GetRemoteFileList(CString directory)
{
if (directory.GetLength() == 0) {
int nItem = m_list_remote.GetSelectionMark();
// 如果有选中的,是目录
if (nItem != -1) {
if (m_list_remote.GetItemData(nItem) == 1) {
directory = m_list_remote.GetItemText(nItem, 0);
}
}
// 从组合框里得到路径
else {
m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path);
}
}
// 得到父目录
if (directory == _T("..")) {
if (m_Remote_Path.GetLength() == 3) return;
m_Remote_Path = GetParentDirectory(m_Remote_Path);
} else if (directory != _T(".")) {
m_Remote_Path += directory;
if (m_Remote_Path.GetLength() > 0 && m_Remote_Path.Right(1) != _T("\\"))
m_Remote_Path += _T("\\");
}
// 是驱动器的根目录,返回磁盘列表
if (m_Remote_Path.GetLength() == 0) {
return;
}
// 发送数据前清空缓冲区
int PacketSize = (m_Remote_Path.GetLength() + 1) * sizeof(TCHAR) + 1;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize);
bPacket[0] = COMMAND_LIST_FILES;
memcpy(bPacket + 1, m_Remote_Path.GetBuffer(0), PacketSize - 1);
m_ContextObject->Send2Client(bPacket, PacketSize);
LocalFree(bPacket);
m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path);
m_Remote_Directory_ComboBox.SetCurSel(0);
// 得到返回数据前禁窗口
m_list_remote.EnableWindow(FALSE);
m_list_remote_driver.EnableWindow(FALSE);
DRIVE_CAZ = FALSE;
}
void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1) {
//获取文件详细信息
POSITION pos = m_list_remote.GetFirstSelectedItemPosition();
if (pos != NULL) {
int nItem = m_list_remote.GetNextSelectedItem(pos);
CString filename = m_list_remote.GetItemText(nItem, 0);
filename = m_Remote_Path + filename;
// 发送数据前清空缓冲区
int PacketSize = (filename.GetLength() + 1) * sizeof(TCHAR) + 1;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize);
bPacket[0] = COMMAND_FILE_GETINFO;
memcpy(bPacket + 1, filename.GetBuffer(0), PacketSize - 1);
m_ContextObject->Send2Client(bPacket, PacketSize);
LocalFree(bPacket);
}
return;
}
GetRemoteFileList();
*pResult = 0;
}
void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult)
{
if (m_list_remote_driver.GetSelectedCount() == 0)
return;
int nItem = m_list_remote_driver.GetSelectionMark();
CString directory = m_list_remote_driver.GetItemText(nItem, 0);
if (directory.Compare(_T("桌面")) == 0) {
m_Remote_Directory_ComboBox.SetWindowText(m_strDesktopPath);
m_list_remote.SetSelectionMark(-1);
GetRemoteFileList();
return;
}
if (directory.Compare(_T("最近")) == 0) {
BYTE byToken = COMMAND_FILE_RECENT;
m_ContextObject->Send2Client(&byToken, 1);
return;
}
m_Remote_Path = directory;
// 发送数据前清空缓冲区
int PacketSize = (directory.GetLength() + 1) * sizeof(TCHAR) + 1;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize);
bPacket[0] = COMMAND_LIST_FILES;
memcpy(bPacket + 1, directory.GetBuffer(0), PacketSize - 1);
m_ContextObject->Send2Client(bPacket, PacketSize);
LocalFree(bPacket);
m_Remote_Directory_ComboBox.InsertString(0, directory);
m_Remote_Directory_ComboBox.SetCurSel(0);
// 得到返回数据前禁窗口
m_list_remote.EnableWindow(FALSE);
m_list_remote_driver.EnableWindow(FALSE);
DRIVE_CAZ = FALSE;
*pResult = 0;
}
void CFileManagerDlg::OnclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult)
{
}
void CFileManagerDlg::OnclkListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
}
void CFileManagerDlg::OnclickListSearch(NMHDR* pNMHDR, LRESULT* pResult)
{
}
int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes);
void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen)
{
// 重建标题
m_list_remote.DeleteAllItems();
int nItemIndex = 0;
m_list_remote.SetItemData
(
m_list_remote.InsertItem(nItemIndex++, _T(".."), GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),
1
);
/*
ListView
SetRedraw(FALSE)
SetRedraw(TRUE)
*/
m_list_remote.SetRedraw(FALSE);
if (dwBufferLen != 0) {
//
for (int i = 0; i < 2; i++) {
// 跳过Token共5字节
byte* pList = (byte*)(pbBuffer + 1);
for (byte* pBase = pList; (unsigned long)(pList - pBase) < dwBufferLen - 1;) {
TCHAR* pszFileName = NULL;
DWORD dwFileSizeHigh = 0; // 文件高字节大小
DWORD dwFileSizeLow = 0; // 文件低字节大小
int nItem = 0;
bool bIsInsert = false;
FILETIME ftm_strReceiveLocalFileTime;
int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
// i 为 0 时列目录i为1时列文件
bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i;
pszFileName = (TCHAR*)++pList;
if (bIsInsert) {
int iicon = GetIconIndex(pszFileName, nType);
nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, iicon);
m_list_remote.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY);
SHFILEINFO sfi = {};
SHGetFileInfo(pszFileName, FILE_ATTRIBUTE_NORMAL | nType, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_list_remote.SetItemText(nItem, 2, sfi.szTypeName);
}
// 得到文件大小
pList += (lstrlen(pszFileName) + 1) * sizeof(TCHAR);
if (bIsInsert) {
CString strFileSize;
memcpy(&dwFileSizeHigh, pList, 4);
memcpy(&dwFileSizeLow, pList + 4, 4);
__int64 nFileSize = ((__int64)dwFileSizeHigh << 32) + dwFileSizeLow;
if (nFileSize >= 1024 * 1024 * 1024)
strFileSize.Format(_T("%0.2f GB"), (double)nFileSize / (1024 * 1024 * 1024));
else if (nFileSize >= 1024 * 1024)
strFileSize.Format(_T("%0.2f MB"), (double)nFileSize / (1024 * 1024));
else
strFileSize.Format(_T("%I64u KB"), nFileSize / 1024 + (nFileSize % 1024 ? 1 : 0));
m_list_remote.SetItemText(nItem, 1, strFileSize);
memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME));
CTime time(ftm_strReceiveLocalFileTime);
m_list_remote.SetItemText(nItem, 3, time.Format(_T("%Y-%m-%d %H:%M")));
}
pList += 16;
}
}
}
m_list_remote.SetRedraw(TRUE);
// 恢复窗口
m_list_remote.EnableWindow(TRUE);
m_list_remote_driver.EnableWindow(TRUE);
if (DRIVE_CAZ == FALSE) {
DWORD_PTR dwResult;
ShowMessage(_T("远程目录:%s"), m_Remote_Path);
SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
}
void CFileManagerDlg::ShowMessage(TCHAR* lpFmt, ...)
{
TCHAR buff[1024];
va_list arglist;
va_start(arglist, lpFmt);
memset(buff, 0, sizeof(buff));
vsprintf_s(buff, lpFmt, arglist);
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 0, (LPARAM)buff, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
va_end(arglist);
}
void CFileManagerDlg::OnGo()
{
m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path);
m_Remote_Path += _T("\\");
GetRemoteFileList(_T(".."));
}
void CFileManagerDlg::OnRemotePrev()
{
GetRemoteFileList(_T(".."));
}
//////////////////////////////////以下为工具栏响应处理//////////////////////////////////////////
void CFileManagerDlg::OnRemoteView()
{
static int i = 0;
switch (i) {
case 0:
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_LIST);
break;
case 1:
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
break;
case 2:
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
break;
case 3:
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
break;
default:
break;
}
i++;
if (i > 3) i = 0;
}
void CFileManagerDlg::OnRemoteRecent()
{
BYTE byToken = COMMAND_FILE_RECENT;
m_ContextObject->Send2Client(&byToken, 1);
}
void CFileManagerDlg::OnRemoteDesktop()
{
m_Remote_Directory_ComboBox.SetWindowText(m_strDesktopPath);
m_list_remote.SetSelectionMark(-1);
GetRemoteFileList();
}
bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName)
{
TCHAR lpszFilter[MAX_PATH];
TCHAR* lpszSlash = NULL;
memset(lpszFilter, 0, sizeof(lpszFilter));
if (lpPathName[lstrlen(lpPathName) - 1] != _T('\\'))
lpszSlash = _T("\\");
else
lpszSlash = _T("");
wsprintf(lpszFilter, _T("%s%s*.*"), lpPathName, lpszSlash);
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return FALSE;
do {
if (wfd.cFileName[0] == _T('.'))
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
TCHAR strDirectory[MAX_PATH];
wsprintf(strDirectory, _T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName);
FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归
} else {
CString file;
file.Format(_T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName);
m_Remote_Upload_Job.AddTail(file);
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
return true;
}
void CFileManagerDlg::EnableControl(BOOL bEnable)
{
// m_list_local.EnableWindow(bEnable);
// m_Local_Directory_ComboBox.EnableWindow(bEnable);
m_list_remote.EnableWindow(bEnable);
m_Remote_Directory_ComboBox.EnableWindow(bEnable);
}
CString CFileManagerDlg::ExtractNameFromFullPath(CString szFullPath)
{
TCHAR path_buffer[_MAX_PATH];
TCHAR fname[_MAX_FNAME];
TCHAR ext[_MAX_EXT];
_tcscpy_s(path_buffer, szFullPath);
_tsplitpath_s(szFullPath, NULL, 0, NULL, 0, fname, fname ? _MAX_FNAME : 0, ext, ext ? _MAX_EXT : 0);
return CString(fname) + CString(ext);
}
void CFileManagerDlg::OnTransferSend()
{
m_bIsUpload = true;
// 重置上传任务列表
m_Remote_Upload_Job.RemoveAll();
CString file = GetDirectoryPath(TRUE);
if (file == "") return;
m_Local_Path = file.Left(file.ReverseFind(_T('\\')) + 1);
if (GetFileAttributes(file) & FILE_ATTRIBUTE_DIRECTORY) {
if (file.GetAt(file.GetLength() - 1) != _T('\\'))
file += _T("\\");
FixedUploadDirectory(file.GetBuffer(0));
} else {
m_Remote_Upload_Job.AddTail(file);
}
if (m_Remote_Upload_Job.IsEmpty()) {
::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
EnableControl(FALSE);
SendUploadJob();
}
void CFileManagerDlg::TransferSend(CString file)
{
if (!m_list_remote.GetItemText(0, 0).Compare(_T("")))
return;
m_bIsUpload = true;
// 重置上传任务列表
m_Remote_Upload_Job.RemoveAll();
if (file == "") return;
m_Local_Path = file.Left(file.ReverseFind(_T('\\')) + 1);
if (GetFileAttributes(file) & FILE_ATTRIBUTE_DIRECTORY) {
if (file.GetAt(file.GetLength() - 1) != _T('\\'))
file += _T("\\");
FixedUploadDirectory(file.GetBuffer(0));
} else {
m_Remote_Upload_Job.AddTail(file);
}
if (m_Remote_Upload_Job.IsEmpty()) {
::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
EnableControl(FALSE);
SendUploadJob();
}
// 获取选择的路径
CString CFileManagerDlg::GetDirectoryPath(BOOL bIncludeFiles)
{
CString szSavePath;
TCHAR szBrowsePath[MAX_PATH];
ZeroMemory(szBrowsePath, sizeof(szBrowsePath));
BROWSEINFO bi = { 0 }; //因为已经初始化为0.所以有些项不用再重复赋值了
bi.hwndOwner = m_hWnd;
bi.pszDisplayName = szBrowsePath;
if (bIncludeFiles) {
bi.lpszTitle = _T("请选择上传路径: ");
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
} else {
bi.lpszTitle = _T("请选择下载路径: ");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
}
LPITEMIDLIST lpiml = { 0 };
lpiml = SHBrowseForFolder(&bi); //如果没有选中目录则返回NULL
if (lpiml && SHGetPathFromIDList(lpiml, szBrowsePath))//从lpiml 中获取路径信息
szSavePath = szBrowsePath;
else
return _T("");
return szSavePath;
}
//////////////// 文件传输操作 ////////////////
// 只管发出了下载的文件
// 一个一个发,接收到下载完成时,下载第二个文件 ...
void CFileManagerDlg::OnRemoteCopy()
{
m_bIsUpload = false;
// 禁用文件管理窗口
EnableControl(FALSE);
CString file;
m_Remote_Download_Job.RemoveAll();
POSITION pos = m_list_remote.GetFirstSelectedItemPosition();
while (pos) {
int nItem = m_list_remote.GetNextSelectedItem(pos);
file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
// 如果是目录
if (m_list_remote.GetItemData(nItem))
file += '\\';
m_Remote_Download_Job.AddTail(file);
}
if (file.IsEmpty()) {
EnableControl(TRUE);
::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
strLpath = GetDirectoryPath(FALSE);
if (strLpath == _T("")) {
EnableControl(TRUE);
return;
}
if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\'))
strLpath += _T("\\");
m_nTransferMode = TRANSFER_MODE_NORMAL;
// 发送第一个下载任务
SendDownloadJob();
}
// 发出一个下载任务
BOOL CFileManagerDlg::SendDownloadJob()
{
if (m_Remote_Download_Job.IsEmpty())
return FALSE;
EnableControl(FALSE);
// 发出第一个下载任务命令
CString file = m_Remote_Download_Job.GetHead();
int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize);
bPacket[0] = COMMAND_DOWN_FILES;
// 文件偏移,续传时用
memcpy(bPacket + 1, file.GetBuffer(0), (file.GetLength() + 1) * sizeof(TCHAR));
m_ContextObject->Send2Client(bPacket, nPacketSize);
LocalFree(bPacket);
// 从下载任务列表中删除自己
m_Remote_Download_Job.RemoveHead();
return TRUE;
}
// 发出一个上传任务
BOOL CFileManagerDlg::SendUploadJob()
{
if (m_Remote_Upload_Job.IsEmpty())
return FALSE;
EnableControl(FALSE);
CString strDestDirectory = m_Remote_Path;
// 如果远程也有选择,当做目标文件夹
int nItem = m_list_remote.GetSelectionMark();
if (!m_hCopyDestFolder.IsEmpty()) {
strDestDirectory += m_hCopyDestFolder + _T("\\");
}
if (strDestDirectory.IsEmpty()) {
m_Local_Path = _T("");
m_Remote_Upload_Job.RemoveHead();
EnableControl(TRUE);
::MessageBox(m_hWnd, _T("请选择目录!"), _T("警告"), MB_OK | MB_ICONWARNING);
return 0;
}
// 发出第一个下载任务命令
m_strOperatingFile = m_Remote_Upload_Job.GetHead();
DWORD dwSizeHigh;
DWORD dwSizeLow;
CString fileRemote = m_strOperatingFile; // 远程文件
// 得到要保存到的远程的文件路径
fileRemote.Replace(m_Local_Path, strDestDirectory);
m_strFileName = m_strUploadRemoteFile = fileRemote;
if (m_hFileSend != INVALID_HANDLE_VALUE)
SAFE_CLOSE_HANDLE(m_hFileSend);
m_hFileSend = CreateFile(m_strOperatingFile.GetBuffer(0),
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (m_hFileSend == INVALID_HANDLE_VALUE)
return FALSE;
dwSizeLow = GetFileSize(m_hFileSend, &dwSizeHigh);
m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow;
//SAFE_CLOSE_HANDLE(m_hFileSend); // 此处不要关闭, 以后还要用
// 构造数据包,发送文件长度(1字节token, 8字节大小, 文件名称, '\0')
int nPacketSize = (fileRemote.GetLength() + 1) * sizeof(TCHAR) + 9;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize);
memset(bPacket, 0, nPacketSize);
bPacket[0] = COMMAND_FILE_SIZE;
memcpy(bPacket + 1, &dwSizeHigh, sizeof(DWORD));
memcpy(bPacket + 5, &dwSizeLow, sizeof(DWORD));
memcpy(bPacket + 9, fileRemote.GetBuffer(0), (fileRemote.GetLength() + 1) * sizeof(TCHAR));
m_ContextObject->Send2Client(bPacket, nPacketSize);
LocalFree(bPacket);
// 从下载任务列表中删除自己
m_Remote_Upload_Job.RemoveHead();
return TRUE;
}
// 发出一个删除任务
BOOL CFileManagerDlg::SendDeleteJob()
{
if (m_Remote_Delete_Job.IsEmpty())
return FALSE;
EnableControl(FALSE);
// 发出第一个下载任务命令
CString file = m_Remote_Delete_Job.GetHead();
int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1;
BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize);
m_strFileName = file;
if (file.GetAt(file.GetLength() - 1) == '\\')
bPacket[0] = COMMAND_DELETE_DIRECTORY;
else
bPacket[0] = COMMAND_DELETE_FILE;
// 文件偏移,续传时用
memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1);
m_ContextObject->Send2Client(bPacket, nPacketSize);
LocalFree(bPacket);
// 从下载任务列表中删除自己
m_Remote_Delete_Job.RemoveHead();
DRIVE_CAZ = TRUE;
return TRUE;
}
void CFileManagerDlg::CreateLocalRecvFile()
{
// 重置计数器
m_nCounter = 0;
FILESIZE* pFileSize = (FILESIZE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
DWORD dwSizeHigh = pFileSize->dwSizeHigh;
DWORD dwSizeLow = pFileSize->dwSizeLow;
if (pFileSize->error==FALSE) {
EnableControl(TRUE);
return;
}
m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow;
// 当前正操作的文件名
m_strOperatingFile = (TCHAR*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(9));
m_strReceiveLocalFile = m_strOperatingFile;
// 得到要保存到的本地的文件路径
m_strReceiveLocalFile.Replace(m_Remote_Path, strLpath);
m_strFileName = m_strReceiveLocalFile;
// 创建多层目录
MakeSureDirectoryPathExists(m_strReceiveLocalFile.GetBuffer(0));
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(m_strReceiveLocalFile.GetBuffer(0), &FindFileData);
if (hFind != INVALID_HANDLE_VALUE
&& m_nTransferMode != TRANSFER_MODE_OVERWRITE_ALL
&& m_nTransferMode != TRANSFER_MODE_ADDITION_ALL
&& m_nTransferMode != TRANSFER_MODE_JUMP_ALL
) {
CFileTransferModeDlg dlg(this);
dlg.m_strFileName = m_strReceiveLocalFile;
switch (dlg.DoModal()) {
case IDC_OVERWRITE:
m_nTransferMode = TRANSFER_MODE_OVERWRITE;
break;
case IDC_OVERWRITE_ALL:
m_nTransferMode = TRANSFER_MODE_OVERWRITE_ALL;
break;
case IDC_ADDITION:
m_nTransferMode = TRANSFER_MODE_ADDITION;
break;
case IDC_ADDITION_ALL:
m_nTransferMode = TRANSFER_MODE_ADDITION_ALL;
break;
case IDC_JUMP:
m_nTransferMode = TRANSFER_MODE_JUMP;
break;
case IDC_JUMP_ALL:
m_nTransferMode = TRANSFER_MODE_JUMP_ALL;
break;
case IDC_CANCEL:
m_nTransferMode = TRANSFER_MODE_CANCEL;
break;
}
}
if (m_nTransferMode == TRANSFER_MODE_CANCEL) {
// 取消传送
m_bIsStop = true;
SendStop(TRUE);
FindClose(hFind);
return;
}
int nTransferMode;
switch (m_nTransferMode) {
case TRANSFER_MODE_OVERWRITE_ALL:
nTransferMode = TRANSFER_MODE_OVERWRITE;
break;
case TRANSFER_MODE_ADDITION_ALL:
nTransferMode = TRANSFER_MODE_ADDITION;
break;
case TRANSFER_MODE_JUMP_ALL:
nTransferMode = TRANSFER_MODE_JUMP;
break;
default:
nTransferMode = m_nTransferMode;
}
// 1字节Token,四字节偏移高四位,四字节偏移低四位
BYTE bToken[9];
DWORD dwCreationDisposition; // 文件打开方式
memset(bToken, 0, sizeof(bToken));
bToken[0] = COMMAND_CONTINUE;
// 文件已经存在
if (hFind != INVALID_HANDLE_VALUE) {
// 提示点什么
// 如果是续传
if (nTransferMode == TRANSFER_MODE_ADDITION) {
memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4);
memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4);
// 接收的长度递增
m_nCounter += (__int64)FindFileData.nFileSizeHigh << 32;
m_nCounter += FindFileData.nFileSizeLow;
dwCreationDisposition = OPEN_EXISTING;
}
// 覆盖
else if (nTransferMode == TRANSFER_MODE_OVERWRITE) {
// 偏移置0
memset(bToken + 1, 0, 8);
// 重新创建
dwCreationDisposition = CREATE_ALWAYS;
}
// 跳过,指针移到-1
else if (nTransferMode == TRANSFER_MODE_JUMP) {
DWORD dwOffset = -1;
memcpy(bToken + 1, &dwOffset, 4);
memcpy(bToken + 5, &dwOffset, 4);
dwCreationDisposition = OPEN_EXISTING;
DWORD_PTR dwResult;
SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 100, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
} else {
// 偏移置0
memset(bToken + 1, 0, 8);
// 重新创建
dwCreationDisposition = CREATE_ALWAYS;
}
FindClose(hFind);
if (m_hFileRecv != INVALID_HANDLE_VALUE)
SAFE_CLOSE_HANDLE(m_hFileRecv);
m_hFileRecv = CreateFile(m_strReceiveLocalFile.GetBuffer(0),
GENERIC_WRITE, 0, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0);
// 需要错误处理
if (m_hFileRecv == INVALID_HANDLE_VALUE) {
m_nOperatingFileLength = 0;
m_nCounter = 0;
::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件创建失败"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
ShowProgress();
if (m_bIsStop)
SendStop(TRUE);
else {
// 发送继续传输文件的token,包含文件续传的偏移
m_ContextObject->Send2Client(bToken, sizeof(bToken));
}
}
// 写入文件内容
void CFileManagerDlg::WriteLocalRecvFile()
{
// 传输完毕
BYTE* pData;
DWORD dwBytesToWrite;
DWORD dwBytesWrite = 0;
int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小为固定的9
FILESIZE* pFileSize;
// 得到数据的偏移
pData = m_ContextObject->m_DeCompressionBuffer.GetBuffer(nHeadLength);
pFileSize = (FILESIZE*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1);
// 得到数据在文件中的偏移, 赋值给计数器
//m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh);
LONG dwOffsetHigh = pFileSize->dwSizeHigh;
LONG dwOffsetLow = pFileSize->dwSizeLow;
// 得到数据在文件中的偏移, 赋值给计数器
m_nCounter = MAKEINT64(dwOffsetLow, dwOffsetHigh);
if (m_nCounter < 0) { //数据出错 返回上传传送数据
m_nCounter = Bf_nCounters;
dwOffsetHigh = Bf_dwOffsetHighs;
dwOffsetLow = Bf_dwOffsetLows;
} else {
Bf_nCounters = m_nCounter;
Bf_dwOffsetHighs = dwOffsetHigh;
Bf_dwOffsetLows = dwOffsetLow;
dwBytesToWrite = m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - nHeadLength;
SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
BOOL bResult = FALSE;
int i = 0;
for (i = 0; i < MAX_WRITE_RETRY; i++) {
// 写入文件
bResult = WriteFile(m_hFileRecv, pData, dwBytesToWrite, &dwBytesWrite, NULL);
if (bResult)
break;
}
if (i == MAX_WRITE_RETRY && !bResult) {
::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件写入失败!"), _T("警告"), MB_OK | MB_ICONWARNING);
2025-07-19 21:37:50 +08:00
m_bIsStop = true;
} else {
2025-07-19 21:37:50 +08:00
dwOffsetLow = 0;
dwOffsetHigh = 0;
dwOffsetLow = SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_CURRENT);
// 为了比较,计数器递增
2025-07-19 21:37:50 +08:00
m_nCounter += dwBytesWrite;
ShowProgress();
}
}
if (m_bIsStop)
SendStop(TRUE);
else {
BYTE bToken[9];
bToken[0] = COMMAND_CONTINUE;
memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow));
m_ContextObject->Send2Client(bToken, sizeof(bToken));
}
}
void CFileManagerDlg::EndLocalRecvFile()
{
m_nCounter = 0;
m_strOperatingFile = "";
m_nOperatingFileLength = 0;
if (m_hFileRecv != INVALID_HANDLE_VALUE) {
SAFE_CLOSE_HANDLE(m_hFileRecv);
m_hFileRecv = INVALID_HANDLE_VALUE;
}
if (m_Remote_Download_Job.IsEmpty() || m_bIsStop) {
m_Remote_Download_Job.RemoveAll();
// 重置传输方式
m_nTransferMode = TRANSFER_MODE_NORMAL;
EnableControl(TRUE);
DWORD_PTR dwResult;
if (m_bIsStop) {
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,
(LPARAM)_T(" 取消下载"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
} else {
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,
(LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
m_bIsStop = false;
} else {
// 我靠不sleep下会出错服了可能以前的数据还没send出去
Sleep(5);
SendDownloadJob();
}
return;
}
void CFileManagerDlg::EndLocalUploadFile()
{
m_nCounter = 0;
m_strOperatingFile = _T("");
m_nOperatingFileLength = 0;
if (m_hFileSend != INVALID_HANDLE_VALUE) {
SAFE_CLOSE_HANDLE(m_hFileSend);
m_hFileSend = INVALID_HANDLE_VALUE;
}
SendStop(FALSE); // 发了之后, 被控端才会关闭句柄
if (m_Remote_Upload_Job.IsEmpty() || m_bIsStop) {
m_Remote_Upload_Job.RemoveAll();
EnableControl(TRUE);
GetRemoteFileList(_T("."));
DWORD_PTR dwResult;
if (m_bIsStop) {
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,
(LPARAM)_T(" 取消上传"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
} else {
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,
(LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
}
m_bIsStop = false;
DRIVE_CAZ = TRUE;
} else {
Sleep(5);
SendUploadJob();
}
return;
}
void CFileManagerDlg::EndRemoteDeleteFile()
{
if (m_Remote_Delete_Job.IsEmpty() || m_bIsStop) {
m_bIsStop = false;
EnableControl(TRUE);
GetRemoteFileList(_T("."));
DWORD_PTR dwResult;
if (m_strFileName.GetAt(m_strFileName.GetLength() - 1) == '\\')
ShowMessage(_T("删除目录:%s (完成)"), m_strFileName);
else
ShowMessage(_T("删除文件:%s (完成)"), m_strFileName);
SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
DRIVE_CAZ = TRUE;
} else {
Sleep(5);
SendDeleteJob();
}
return;
}
void CFileManagerDlg::SendException()
{
BYTE bBuff = COMMAND_FILE_EXCEPTION;
m_ContextObject->Send2Client(&bBuff, 1);
}
void CFileManagerDlg::SendContinue()
{
BYTE bBuff = COMMAND_CONTINUE;
m_ContextObject->Send2Client(&bBuff, 1);
}
void CFileManagerDlg::SendStop(BOOL bIsDownload)
{
if (m_hFileRecv != INVALID_HANDLE_VALUE) {
SAFE_CLOSE_HANDLE(m_hFileRecv);
m_hFileRecv = INVALID_HANDLE_VALUE;
}
BYTE bBuff[2];
bBuff[0] = COMMAND_STOP;
bBuff[1] = bIsDownload;
m_ContextObject->Send2Client(bBuff, sizeof(bBuff));
}
void CFileManagerDlg::ShowProgress()
{
TCHAR* lpDirection = NULL;
if (m_bIsUpload)
lpDirection = _T("文件上传");
else
lpDirection = _T("文件下载");
if (m_nCounter == -1) {
m_nCounter = m_nOperatingFileLength;
}
int progress = (int)((double)(m_nCounter * 100) / m_nOperatingFileLength);
CString str;
DWORD_PTR dwResult;
if (m_nCounter >= 1024 * 1024 * 1024)
str.Format(_T("%.2f GB (%d%%)"), (double)m_nCounter / (1024 * 1024 * 1024), progress);
else if (m_nCounter >= 1024 * 1024)
str.Format(_T("%.2f MB (%d%%)"), (double)m_nCounter / (1024 * 1024), progress);
else
str.Format(_T("%I64u KB (%d%%)"), m_nCounter / 1024 + (m_nCounter % 1024 ? 1 : 0), progress);
ShowMessage(_T("%s: %s"), lpDirection, m_strFileName);
SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, (WPARAM)progress, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)str.GetBuffer(0), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
if (m_nCounter == m_nOperatingFileLength) {
m_nCounter = m_nOperatingFileLength = 0;
// 关闭文件句柄
}
}
void CFileManagerDlg::OnRemoteDelete()
{
m_bIsUpload = false;
// TODO: Add your command handler code here
CString str;
if (m_list_remote.GetSelectedCount() > 1)
str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote.GetSelectedCount());
else {
CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0);
if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1)
str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file);
else
str.Format(_T("确实要把“%s”删除吗?"), file);
}
if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
m_Remote_Delete_Job.RemoveAll();
POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
while (pos) { //so long as we have a valid POSITION, we keep iterating
int nItem = m_list_remote.GetNextSelectedItem(pos);
CString file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
// 如果是目录
if (m_list_remote.GetItemData(nItem))
file += _T('\\');
m_Remote_Delete_Job.AddTail(file);
}
EnableControl(FALSE);
// 发送第一个下载任务
SendDeleteJob();
}
void CFileManagerDlg::OnRemoteStop()
{
m_bIsStop = true;
}
void CFileManagerDlg::PostNcDestroy()
{
if (!m_bIsClosed)
OnClose();
CDialog::PostNcDestroy();
delete this;
}
void CFileManagerDlg::SendTransferMode()
{
CFileTransferModeDlg dlg(this);
dlg.m_strFileName = m_strUploadRemoteFile;
switch (dlg.DoModal()) {
case IDC_OVERWRITE:
m_nTransferMode = TRANSFER_MODE_OVERWRITE;
break;
case IDC_OVERWRITE_ALL:
m_nTransferMode = TRANSFER_MODE_OVERWRITE_ALL;
break;
case IDC_ADDITION:
m_nTransferMode = TRANSFER_MODE_ADDITION;
break;
case IDC_ADDITION_ALL:
m_nTransferMode = TRANSFER_MODE_ADDITION_ALL;
break;
case IDC_JUMP:
m_nTransferMode = TRANSFER_MODE_JUMP;
break;
case IDC_JUMP_ALL:
m_nTransferMode = TRANSFER_MODE_JUMP_ALL;
break;
case IDC_CANCEL:
m_nTransferMode = TRANSFER_MODE_CANCEL;
break;
}
if (m_nTransferMode == TRANSFER_MODE_CANCEL) {
m_bIsStop = true;
EndLocalUploadFile();
return;
}
BYTE bToken[5];
bToken[0] = COMMAND_SET_TRANSFER_MODE;
memcpy(bToken + 1, &m_nTransferMode, sizeof(m_nTransferMode));
m_ContextObject->Send2Client(bToken, sizeof(bToken));
}
void CFileManagerDlg::SendFileData()
{
FILESIZE* pFileSize = (FILESIZE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
LONG dwOffsetHigh = pFileSize->dwSizeHigh;
LONG dwOffsetLow = pFileSize->dwSizeLow;
m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh);
ShowProgress();
if (m_nCounter == m_nOperatingFileLength || (dwOffsetHigh == -1 && dwOffsetLow == -1) || m_bIsStop) {
EndLocalUploadFile();
return;
}
SetFilePointer(m_hFileSend, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小为固定的9
int dwDownFileSize = GetFileSize(m_hFileSend, NULL);
DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength;
DWORD nNumberOfBytesRead = 0;
BYTE* lpBuffer = (BYTE*)LocalAlloc(LPTR, MAX_SEND_BUFFER);
// Token, 大小,偏移,数据
lpBuffer[0] = COMMAND_FILE_DATA;
memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow));
// 返回值
bool bRet = true;
ReadFile(m_hFileSend, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
//SAFE_CLOSE_HANDLE(m_hFileSend); // 此处不要关闭, 以后还要用
if (nNumberOfBytesRead > 0) {
int nPacketSize = nNumberOfBytesRead + nHeadLength;
m_ContextObject->Send2Client(lpBuffer, nPacketSize);
}
LocalFree(lpBuffer);
}
bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory)
{
WIN32_FIND_DATA wfd;
TCHAR lpszFilter[MAX_PATH];
wsprintf(lpszFilter, _T("%s\\*.*"), lpszDirectory);
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return FALSE;
do {
if (wfd.cFileName[0] != '.') {
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
TCHAR strDirectory[MAX_PATH];
wsprintf(strDirectory, _T("%s\\%s"), lpszDirectory, wfd.cFileName);
DeleteDirectory(strDirectory);
} else {
TCHAR strFile[MAX_PATH];
wsprintf(strFile, _T("%s\\%s"), lpszDirectory, wfd.cFileName);
DeleteFile(strFile);
}
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
if (!RemoveDirectory(lpszDirectory)) {
return FALSE;
}
return true;
}
void CFileManagerDlg::OnRemoteNewFolder()
{
if (m_Remote_Path == _T(""))
return;
CInputDialog dlg(this);
dlg.Init(_T("新建目录"), _T("请输入目录名称:"));
if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) {
CString file = m_Remote_Path + dlg.m_str + _T("\\");
UINT nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1;
LPBYTE lpBuffer = new BYTE[nPacketSize];
lpBuffer[0] = COMMAND_CREATE_FOLDER;
memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1);
m_ContextObject->Send2Client(lpBuffer, nPacketSize);
SAFE_DELETE_AR(lpBuffer);
}
}
void CFileManagerDlg::OnTransferRecv()
{
OnRemoteCopy(); //下载
}
void CFileManagerDlg::OnRename()
{
m_list_remote.EditLabel(m_list_remote.GetSelectionMark());
}
void CFileManagerDlg::OnEndLabelEditListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
CString str, strExistingFileName, strNewFileName;
m_list_remote.GetEditControl()->GetWindowText(str);
strExistingFileName = m_Remote_Path + m_list_remote.GetItemText(pDispInfo->item.iItem, 0);
strNewFileName = m_Remote_Path + str;
if (strExistingFileName != strNewFileName) {
UINT nPacketSize = (strExistingFileName.GetLength() + 1) * sizeof(TCHAR) + (strNewFileName.GetLength() + 1) * sizeof(TCHAR) + 1;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketSize);
lpBuffer[0] = COMMAND_RENAME_FILE;
memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), (strExistingFileName.GetLength() + 1) * sizeof(TCHAR));
memcpy(lpBuffer + 1 + (strExistingFileName.GetLength() + 1) * sizeof(TCHAR),
strNewFileName.GetBuffer(0), (strNewFileName.GetLength() + 1) * sizeof(TCHAR));
m_ContextObject->Send2Client(lpBuffer, nPacketSize);
LocalFree(lpBuffer);
}
*pResult = 1;
}
void CFileManagerDlg::OnDelete()
{
BYTE bBuff;
bBuff = COMMAND_FILE_NO_ENFORCE;
m_ContextObject->Send2Client(&bBuff, sizeof(bBuff));
OnRemoteDelete();
}
void CFileManagerDlg::OnDeleteEnforce()
{
BYTE bBuff;
bBuff = COMMAND_FILE_ENFOCE;
m_ContextObject->Send2Client(&bBuff, sizeof(bBuff));
OnRemoteDelete();
}
void CFileManagerDlg::OnNewFolder()
{
OnRemoteNewFolder();
}
void CFileManagerDlg::OnRefresh()
{
GetRemoteFileList(_T("."));
}
void CFileManagerDlg::OnUseAdmin()
{
if (!m_bUseAdmin)
m_bUseAdmin = true;
else
m_bUseAdmin = false;
}
void CFileManagerDlg::OnRemoteOpenShow()
{
// TODO: Add your command handler code here
CString str;
int nItem = m_list_remote.GetSelectionMark();
str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
if (m_list_remote.GetItemData(nItem) == 1)
str += "\\";
int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_OPEN_FILE_SHOW;
lpPacket[1] = m_bUseAdmin;
memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteOpenHide()
{
// TODO: Add your command handler code here
CString str;
int nItem = m_list_remote.GetSelectionMark();
str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
if (m_list_remote.GetItemData(nItem) == 1)
str += _T("\\");
int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_OPEN_FILE_HIDE;
lpPacket[1] = m_bUseAdmin;
memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteInfo()
{
// TODO: Add your command handler code here
CString str;
int nItem = m_list_remote.GetSelectionMark();
str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
if (m_list_remote.GetItemData(nItem) == 1)
str += _T("\\");
int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_INFO;
memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteEncryption()
{
// TODO: Add your command handler code here
CString str;
CStringA strA;
int nItem = m_list_remote.GetSelectionMark();
str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
if (m_list_remote.GetItemData(nItem) == 1)
str += _T("\\");
strA = str;
int nPacketLength = strA.GetLength() + 1 + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_Encryption;
memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteDecrypt()
{
// TODO: Add your command handler code here
CString str;
CStringA strA;
int nItem = m_list_remote.GetSelectionMark();
str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0);
if (m_list_remote.GetItemData(nItem) == 1)
str += _T("\\");
strA = str;
int nPacketLength = strA.GetLength() + 1 + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_Decrypt;
memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteCopyFile()
{
CString file;
// TODO: Add your command handler code here
POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
while (pos) { //so long as we have a valid POSITION, we keep iterating
int nItem = m_list_remote.GetNextSelectedItem(pos);
file += (m_Remote_Path + m_list_remote.GetItemText(nItem, 0));
file += "|";
}
int nPacketLength = file.GetLength() * 2 + 2 + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_CopyFile;
memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
ShowMessage(_T("准备粘贴"));
}
void CFileManagerDlg::OnRemotePasteFile()
{
int nPacketLength = m_Remote_Path.GetLength() * 2 + 2 + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_PasteFile;
memcpy(lpPacket + 1, m_Remote_Path.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemotezip()
{
CString file;
file = m_Remote_Path;
file += "|";
// TODO: Add your command handler code here
POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
while (pos) { //so long as we have a valid POSITION, we keep iterating
int nItem = m_list_remote.GetNextSelectedItem(pos);
file += (m_Remote_Path + m_list_remote.GetItemText(nItem, 0));
// 如果是目录
if (m_list_remote.GetItemData(nItem))
file += _T('\\');
file += "|";
}
int nPacketLength = file.GetLength() * 2 + 2 + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_FILE_zip;
memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
ShowMessage(_T("开始压缩,不要关闭窗口,其他操作继续"));
}
void CFileManagerDlg::OnRemotezipstop()
{
BYTE lpPacket = COMMAND_FILE_zip_stop;
m_ContextObject->Send2Client(&lpPacket, 1);
}
void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult)
{
CMenu mListmeau;
mListmeau.CreatePopupMenu();
mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("分区高级搜索"));
POINT mousepos;
GetCursorPos(&mousepos);
int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL);
mListmeau.DestroyMenu();
if (!nMenuResult) return;
switch (nMenuResult) {
case 100: {
UpdateData();
//获取文件详细信息
POSITION pos = m_list_remote_driver.GetFirstSelectedItemPosition();
CString str_disk;
if (pos != NULL) {
int nItem = m_list_remote_driver.GetNextSelectedItem(pos);
str_disk = m_list_remote_driver.GetItemText(nItem, 0);
if (str_disk.Find(_T(":")) == -1) return;;
}
CInputDialog dlg(this);
dlg.Init(_T("确认后 必须等待出现结果"), _T("请输入要搜索的关键词"));
if (dlg.DoModal() != IDOK)return;
// 得到返回数据前禁窗口
m_list_remote_search.DeleteAllItems();
m_ProgressCtrl->SetPos(0);
struct SEARCH {
TCHAR TC_disk[8];
TCHAR TC_search[MAX_PATH];
};
SEARCH S_search;
memset(&S_search, 0, sizeof(SEARCH));
memcpy(S_search.TC_disk, str_disk.GetBuffer(), str_disk.GetLength() * sizeof(TCHAR));
if (dlg.m_str.GetLength() > (MAX_PATH - 5)) {
MessageBox(_T("搜索关键词太长"), _T("注意"));
return ;
}
memcpy(S_search.TC_search, dlg.m_str.GetBuffer(), dlg.m_str.GetLength() * sizeof(TCHAR));
BYTE* lpbuffer = new BYTE[sizeof(SEARCH) + 1];
lpbuffer[0] = COMMAND_FILE_SEARCHPLUS_LIST;
memcpy(lpbuffer + 1, &S_search, sizeof(SEARCH));
m_ContextObject->Send2Client((LPBYTE)lpbuffer, sizeof(SEARCH) + 1);
SAFE_DELETE_AR(lpbuffer);
SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE);
}
break;
default:
break;
}
*pResult = 0;
}
void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int nRemoteOpenMenuIndex = 5;
CListCtrl* pListCtrl = &m_list_remote;
CMenu popup;
popup.LoadMenu(IDR_FILEMANAGER);
CMenu* pM = popup.GetSubMenu(0);
CPoint p;
GetCursorPos(&p);
// pM->DeleteMenu(IDM_LOCAL_OPEN, MF_BYCOMMAND);
if (pListCtrl->GetSelectedCount() == 0 || !m_Remote_Path.GetLength()) {
int count = pM->GetMenuItemCount();
for (int i = 0; i < count; i++) {
pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED);
}
if (m_Remote_Path.GetLength()) {
pM->EnableMenuItem(IDM_TRANSFER_S, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED);
}
pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_DELETE_ENFORCE, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(ID_FILEMANGER_Encryption, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(ID_FILEMANGER_Encryption, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_RENAME, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED);
}
if (pListCtrl->GetSelectedCount() == 1) {
// 单选如果是目录, 不能隐藏运行
if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) {
pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_REMOTE_OPEN_SHOW, MF_BYCOMMAND | MF_GRAYED);
}
pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED);
}
if (pListCtrl->GetSelectedCount() > 1) {
pM->EnableMenuItem(IDM_REMOTE_OPEN_SHOW, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_RENAME, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED);
}
if (m_bCanAdmin)
pM->EnableMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_ENABLED);
else
pM->EnableMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_GRAYED);
if (m_bUseAdmin)
pM->CheckMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_CHECKED);
else
pM->CheckMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_UNCHECKED);
pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED);
pM->EnableMenuItem(ID_FILEMANGER_ZIP_STOP, MF_BYCOMMAND | MF_ENABLED);
::TrackPopupMenu(pM->GetSafeHmenu(), TPM_RIGHTBUTTON, p.x, p.y, 0, GetSafeHwnd(), NULL);
pM->DestroyMenu();
*pResult = 0;
}
void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult)
{
CMenu mListmeau;
mListmeau.CreatePopupMenu();
mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("下载(附带目录结构)"));
mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除"));
mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("打开文件位置"));
POINT mousepos;
GetCursorPos(&mousepos);
int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL);
mListmeau.DestroyMenu();
if (!nMenuResult) return;
switch (nMenuResult) {
case 100: {
m_bIsUpload = false;
EnableControl(FALSE);
CString file;
m_Remote_Download_Job.RemoveAll();
POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition();
CString m_Search_Path;
while (pos) {
int nItem = m_list_remote_search.GetNextSelectedItem(pos);
m_Search_Path = m_list_remote_search.GetItemText(nItem, 3);
m_Search_Path += '\\';
file = m_Search_Path + m_list_remote_search.GetItemText(nItem, 0);
if (m_list_remote_search.GetItemData(nItem))
file += '\\';
m_Remote_Download_Job.AddTail(file);
}
if (file.IsEmpty()) {
EnableControl(TRUE);
::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING);
return;
}
strLpath = GetDirectoryPath(FALSE);
if (strLpath == _T("")) {
EnableControl(TRUE);
return;
}
if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\'))
strLpath += _T("\\");
m_nTransferMode = TRANSFER_MODE_NORMAL;
SendDownloadJob();
}
break;
case 200: {
m_bIsUpload = false;
// TODO: Add your command handler code here
CString str;
if (m_list_remote_search.GetSelectedCount() > 1)
str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote_search.GetSelectedCount());
else {
CString file = m_list_remote_search.GetItemText(m_list_remote_search.GetSelectionMark(), 0);
if (m_list_remote_search.GetItemData(m_list_remote_search.GetSelectionMark()) == 1)
str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file);
else
str.Format(_T("确实要把“%s”删除吗?"), file);
}
if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
m_Remote_Delete_Job.RemoveAll();
POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
CString m_Search_Path;
while (pos) { //so long as we have a valid POSITION, we keep iterating
int nItem = m_list_remote_search.GetNextSelectedItem(pos);
m_Search_Path = m_list_remote_search.GetItemText(nItem, 3);
m_Search_Path += '\\';
CString file = m_Search_Path + m_list_remote_search.GetItemText(nItem, 0);
// 如果是目录
if (m_list_remote_search.GetItemData(nItem))
file += _T('\\');
m_Remote_Delete_Job.AddTail(file);
} //EO while(pos) -- at this point we have deleted the moving items and stored them in memory
EnableControl(FALSE);
// 发送第一个下载任务
SendDeleteJob();
}
break;
case 300: {
int Index = 0;
Index = m_list_remote_search.GetSelectionMark();
if (Index == -1)
return;
CString str = m_list_remote_search.GetItemText(Index, 3);
if (Index == -1)
return;
m_Remote_Path = _T("");
GetRemoteFileList(str);
}
break;
default:
break;
}
*pResult = 0;
}
bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath)
{
LPTSTR p, pszDirCopy;
DWORD dwAttributes;
__try {
pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1));
if (pszDirCopy == NULL)
return FALSE;
lstrcpy(pszDirCopy, pszDirPath);
p = pszDirCopy;
if ((*p == TEXT('\\')) && (*(p + 1) == TEXT('\\'))) {
p++; // Skip over the first \ in the name.
p++; // Skip over the second \ in the name.
while (*p && *p != TEXT('\\')) {
p = CharNext(p);
}
if (*p) {
p++;
}
while (*p && *p != TEXT('\\')) {
p = CharNext(p);
}
if (*p) {
p++;
}
} else if (*(p + 1) == TEXT(':')) { // Not a UNC. See if it's <drive>:
p++;
p++;
if (*p && (*p == TEXT('\\'))) {
p++;
}
}
while (*p) {
if (*p == TEXT('\\')) {
*p = TEXT('\0');
dwAttributes = GetFileAttributes(pszDirCopy);
// Nothing exists with this name. Try to make the directory name and error if unable to.
if (dwAttributes == 0xffffffff) {
if (!CreateDirectory(pszDirCopy, NULL)) {
if (GetLastError() != ERROR_ALREADY_EXISTS) {
free(pszDirCopy);
return FALSE;
}
}
} else {
if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
// Something exists with this name, but it's not a directory... Error
free(pszDirCopy);
return FALSE;
}
}
*p = TEXT('\\');
}
p = CharNext(p);
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
free(pszDirCopy);
return FALSE;
}
free(pszDirCopy);
return TRUE;
}
//压缩处理
void CFileManagerDlg::OnCompress()
{
// TODO: 在此添加命令处理程序代码
//winrar a -r D:\123.she.rar d:\123.she //加压
UpdateData(TRUE);
int i = m_list_remote.GetSelectionMark();
if (i < 0) {
return;
}
CString strMsg = _T("a -ep1 -ibck ");
CString strFullFileName = m_list_remote.GetItemText(i, 0);
if (m_list_remote.GetItemData(i)) { //文件夹
strMsg += _T("-r ");
strMsg += (m_Remote_Path + strFullFileName);
} else {
strMsg += (m_Remote_Path + strFullFileName);
}
strMsg += _T(".rar");
strMsg += _T(" ");
strMsg += (m_Remote_Path + strFullFileName);
int nPacketLength = (strMsg.GetLength() + 1) * sizeof(TCHAR) + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM;
memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnUncompress()
{
// TODO: 在此添加命令处理程序代码
// winrar x D:\11.she.rar D:\11.she\
UpdateData(TRUE);
int i = m_list_remote.GetSelectionMark();
if (i < 0) {
return;
}
CString strMsg = _T("x -ibck ");
CString strFullFileName = m_list_remote.GetItemText(i, 0);
CString strFullName = (m_Remote_Path + strFullFileName);
strMsg += strFullName;
//LFileName lFile(strFullName.GetBuffer(0));
strMsg += _T(" ");
strMsg += (m_Remote_Path/*+lFile.getNameA()*/);
//strMsg += "\\";
//COMMAND_UNCOMPRESS_FILE_PARAM
int nPacketLength = (strMsg.GetLength() + 1) * sizeof(TCHAR) + 1;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM;
memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1);
m_ContextObject->Send2Client(lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnSetfocusRemotePath()
{
// TODO: Add your control notification handler code here
m_list_remote.SetSelectionMark(-1);
}
void CFileManagerDlg::OnBtnSearch()
{
UpdateData();
// // 得到返回数据前禁窗口
m_list_remote_search.DeleteAllItems();
m_ProgressCtrl->SetPos(0);
if (m_Remote_Path.IsEmpty()) return;
// 构建数据包
FILESEARCH mFileSearchPacket;
lstrcpy(mFileSearchPacket.SearchPath, m_Remote_Path.GetBuffer(0));
lstrcpy(mFileSearchPacket.SearchFileName, m_SearchStr.GetBuffer(0));
if (m_bSubFordle)
mFileSearchPacket.bEnabledSubfolder = true;
else
mFileSearchPacket.bEnabledSubfolder = false;
int nPacketSize = sizeof(mFileSearchPacket) + 2;
LPBYTE lpBuffer = new BYTE[nPacketSize];
lpBuffer[0] = COMMAND_SEARCH_FILE;
memcpy(lpBuffer + 1, &mFileSearchPacket, sizeof(mFileSearchPacket));
m_ContextObject->Send2Client(lpBuffer, nPacketSize);
SAFE_DELETE_AR(lpBuffer);
// 设置按钮状态
m_BtnSearch.SetWindowText(_T("正在搜索..."));
m_list_remote_search.ShowWindow(SW_SHOW);
GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(FALSE);
GetDlgItem(ID_SEARCH_STOP)->EnableWindow(TRUE);
SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE);
}
void CFileManagerDlg::SearchEnd()
{
int len = m_list_remote_search.GetItemCount();
m_BtnSearch.SetWindowText(_T("重新搜索"));
ShowMessage(_T("搜索完毕 共:%d 个文件"), len);
m_list_remote_search.EnableWindow(TRUE);
GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(TRUE);
GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE);
}
void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLen)
{
byte* pList = pbBuffer + 1;
int nItemIndex = 0;
for (byte* pBase = pList; (int)(pList - pBase) < (int)(dwBufferLen - 1);) {
TCHAR* pszFileName = NULL;
DWORD dwFileSizeHigh = 0;
DWORD dwFileSizeLow = 0;
FILETIME ftm_strReceiveLocalFileTime;
int nItem = 0;
bool bIsInsert = false;
int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
pszFileName = (TCHAR*) ++pList;
CString csFilePath, csFileFullName;
csFilePath.Format(_T("%s"), pszFileName);
int nPos = csFilePath.ReverseFind(_T('\\'));
csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos - 1);// 获取文件全名,包括文件名和扩展名
nItem = m_list_remote_search.InsertItem(nItemIndex++, csFileFullName, GetIconIndex(pszFileName, nType));
m_list_remote_search.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY);
pList += (lstrlen(pszFileName) + 1) * sizeof(TCHAR);
memcpy(&dwFileSizeHigh, pList, 4);
memcpy(&dwFileSizeLow, pList + 4, 4);
CString strSize;
strSize.Format(_T("%10d KB"), (dwFileSizeHigh * (MAXDWORD)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0));
m_list_remote_search.SetItemText(nItem, 1, strSize);
memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME));
CTime time(ftm_strReceiveLocalFileTime);
m_list_remote_search.SetItemText(nItem, 2, time.Format(_T("%Y-%m-%d %H:%M")));
PathRemoveFileSpec(pszFileName); //去除文件名获取文件路径
m_list_remote_search.SetItemText(nItem, 3, pszFileName);
pList += 16;
}
m_ProgressCtrl->StepIt();
}
//文件搜索停止
void CFileManagerDlg::OnBnClickedSearchStop()
{
GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE);
// TODO: Add your command handler code here
BYTE bToken = COMMAND_FILES_SEARCH_STOP;
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
}
//显示搜索结果
void CFileManagerDlg::OnBnClickedSearchResult()
{
m_list_remote_search.ShowWindow(m_list_remote_search.IsWindowVisible() ? SW_HIDE : SW_SHOW);
if (m_list_remote_search.IsWindowVisible()) {
SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE);
} else {
SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE);
}
}
void CFileManagerDlg::ShowSearchPlugList()
{
char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
char* Filename;
char* Pathname;
DWORD dwOffset = 0;
m_list_remote_search.DeleteAllItems();
int i = 0;
for (i = 0; dwOffset < (m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1); i++) {
Filename = lpBuffer + dwOffset;
Pathname = Filename + strlen(Filename) + 1;
CString CS_tem;
CS_tem = Filename;
m_list_remote_search.InsertItem(i, CS_tem, 0);
CS_tem = Pathname;
int index = CS_tem.ReverseFind('\\');
if (index >= 0)
CS_tem = CS_tem.Left(index);
m_list_remote_search.SetItemText(i,3, CS_tem);
dwOffset += strlen(Filename) + strlen(Pathname) + 2;
}
m_list_remote_search.EnableWindow(TRUE);
CString strMsgShow;
strMsgShow.Format(_T("共搜索到 %d 个"), i);
DWORD_PTR dwResult;
SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, & dwResult);
m_list_remote_search.ShowWindow( SW_SHOW);
}