Files
SimpleRemoter/server/2015Remote/FileManagerDlg.h
yuanyuanxiang dd222e5379 Feature: Add file search for local and remote in File Manager
- Client: threaded recursive search with wildcard matching, 2-second
  buffer flush for real-time progress, max depth 32 / max results 10000
- Server: local search with collect-all-then-display pattern, worker
  thread, time-based progress updates, partial results on stop
- Toolbar: Desktop/Downloads/Home navigation buttons for both sides
- Button state management via OnUpdate handlers during search
- Stop vs navigate semantics with separate flags for proper cleanup
- Expand environment variables in remote paths (%USERPROFILE% etc.)
- i18n: add search-related strings to en_US and zh_TW language files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:04:53 +08:00

279 lines
9.4 KiB
C++

#if !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_)
#define AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_
#include "TrueColorToolBar.h" // Added by ClassView
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "IOCPServer.h"
#include "SortListCtrl.h"
#include <map>
#include <string>
#include <vector>
#define CIOCPServer IOCPServer
#define ClientContext CONTEXT_OBJECT
typedef struct {
DWORD dwSizeHigh;
DWORD dwSizeLow;
} FILESIZE;
#define m_DeCompressionBuffer InDeCompressedBuffer
#define GetBufferLen GetBufferLength
#define m_Dialog hDlg
#define m_Socket sClientSocket
#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32))
#define MAX_WRITE_RETRY 15 // 重试写入文件次数
#define WM_MY_MESSAGE (WM_USER+300)
#define WM_LOCAL_SEARCH_DONE (WM_USER+302)
#define WM_LOCAL_SEARCH_PROGRESS (WM_USER+303)
// FileManagerDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg dialog
typedef CList<CString, CString&> strList;
class CFileManagerDlg : public DialogBase
{
protected:
// 更新状态栏信息
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)
{
char *buff = (char*)lParam;
m_wndStatusBar.SetPaneText(0, buff);
delete[]buff;
return S_OK;
}
// Construction
public:
bool m_bIsStop;
CString m_strReceiveLocalFile;
CString m_strUploadRemoteFile;
void ShowProgress();
void SendStop();
int m_nTransferMode;
CString m_hCopyDestFolder;
void SendContinue();
void SendException();
void EndLocalRecvFile();
void EndRemoteDeleteFile();
CString m_strOperatingFile; // 文件名
__int64 m_nOperatingFileLength; // 文件总大小
__int64 m_nCounter;// 计数器
void WriteLocalRecvFile();
void CreateLocalRecvFile();
BOOL SendDownloadJob();
BOOL SendUploadJob();
BOOL SendDeleteJob();
void UpdateWindowsPos();
strList m_Remote_Download_Job;
strList m_Remote_Upload_Job;
strList m_Remote_Delete_Job;
CTrueColorToolBar m_wndToolBar_Local;
CTrueColorToolBar m_wndToolBar_Remote;
void ShowMessage(const char *lpFmt, ...);
CString m_Remote_Path;
BYTE m_bRemoteDriveList[1024];
CString GetParentDirectory(CString strPath);
void OnReceiveComplete();
int m_nNewIconBaseIndex; // 新加的ICON
CProgressCtrl* m_ProgressCtrl;
HCURSOR m_hCursor;
CString m_Local_Path;
bool FixedUploadDirectory(LPCTSTR lpPathName);
void FixedLocalDriveList();
void FixedRemoteDriveList();
void FixedLocalFileList(CString directory = "");
void GetRemoteFileList(CString directory = "");
void FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen);
void FixedRemoteSearchFileList(BYTE *pbBuffer, DWORD dwBufferLen);
bool m_bSearching;
bool m_bSearchStopped;
int m_nSearchResultCount;
DWORD m_dwSearchStartTime;
CString m_strSearchPath;
CString m_strSearchName;
std::map<std::string, int> m_IconCache;
// 本地搜索
bool m_bLocalSearching;
bool m_bLocalSearchStopped;
int m_nLocalSearchResultCount;
DWORD m_dwLocalSearchStartTime;
CString m_strLocalSearchPath;
CString m_strLocalSearchName;
std::map<std::string, int> m_LocalIconCache;
HANDLE m_hLocalSearchThread;
static DWORD WINAPI LocalSearchThreadProc(LPVOID lpParam);
void LocalSearchWorker();
static bool WildcardMatch(LPCTSTR pattern, LPCTSTR str);
struct LocalSearchItem {
CString fileName;
CString dir;
CString ext;
BOOL bIsDir;
DWORD sizeHigh, sizeLow;
FILETIME ftWrite;
};
afx_msg LRESULT OnLocalSearchDone(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnLocalSearchProgress(WPARAM wParam, LPARAM lParam);
CStatusBar m_wndStatusBar;
CFileManagerDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor
~CFileManagerDlg()
{
m_bLocalSearching = false;
m_bLocalSearchStopped = true;
if (m_hLocalSearchThread) {
// 处理消息避免SendMessage死锁
while (MsgWaitForMultipleObjects(1, &m_hLocalSearchThread, FALSE, 5000, QS_ALLINPUT) == WAIT_OBJECT_0 + 1) {
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CloseHandle(m_hLocalSearchThread);
}
if(m_ProgressCtrl) delete m_ProgressCtrl;
}
// Dialog Data
//{{AFX_DATA(CFileManagerDlg)
enum { IDD = IDD_FILE };
CComboBox m_Remote_Directory_ComboBox;
CComboBox m_Local_Directory_ComboBox;
CSortListCtrl m_list_remote;
CSortListCtrl m_list_local;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFileManagerDlg)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void PostNcDestroy();
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CFileManagerDlg)
virtual BOOL OnInitDialog();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBegindragListLocal(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBegindragListRemote(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnClose();
afx_msg void OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnLocalPrev();
afx_msg void OnRemotePrev();
afx_msg void OnLocalView();
afx_msg void OnLocalList();
afx_msg void OnLocalReport();
afx_msg void OnLocalBigicon();
afx_msg void OnLocalSmallicon();
afx_msg void OnRemoteBigicon();
afx_msg void OnRemoteList();
afx_msg void OnRemoteReport();
afx_msg void OnRemoteSmallicon();
afx_msg void OnRemoteView();
afx_msg void OnUpdateLocalStop(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemoteStop(CCmdUI* pCmdUI);
afx_msg void OnUpdateLocalPrev(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemotePrev(CCmdUI* pCmdUI);
afx_msg void OnUpdateLocalCopy(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemoteCopy(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemoteDelete(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemoteNewfolder(CCmdUI* pCmdUI);
afx_msg void OnUpdateLocalDelete(CCmdUI* pCmdUI);
afx_msg void OnUpdateLocalNewfolder(CCmdUI* pCmdUI);
afx_msg void OnUpdateLocalSearch(CCmdUI* pCmdUI);
afx_msg void OnUpdateRemoteSearch(CCmdUI* pCmdUI);
afx_msg void OnRemoteCopy();
afx_msg void OnLocalCopy();
afx_msg void OnRemoteCompress();
afx_msg void OnLocalCompress();
afx_msg void OnRemoteUnCompress();
afx_msg void OnLocalUnCompress();
afx_msg void OnLocalDelete();
afx_msg void OnRemoteDelete();
afx_msg void OnRemoteStop();
afx_msg void OnLocalStop();
afx_msg void OnLocalNewfolder();
afx_msg void OnRemoteNewfolder();
afx_msg void OnTransfer();
afx_msg void OnRename();
afx_msg void OnEndlabeleditListLocal(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnEndlabeleditListRemote(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDelete();
afx_msg void OnNewfolder();
afx_msg void OnRefresh();
afx_msg void OnLocalOpen();
afx_msg void OnRemoteOpenShow();
afx_msg void OnRemoteOpenHide();
afx_msg void OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnLocalDesktop();
afx_msg void OnLocalDownloads();
afx_msg void OnLocalHome();
afx_msg void OnLocalSearch();
afx_msg void OnRemoteDesktop();
afx_msg void OnRemoteDownloads();
afx_msg void OnRemoteHome();
afx_msg void OnRemoteSearch();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
protected:
CListCtrl* m_pDragList; //Which ListCtrl we are dragging FROM
CListCtrl* m_pDropList; //Which ListCtrl we are dropping ON
BOOL m_bDragging; //T during a drag operation
int m_nDragIndex; //Index of selected item in the List we are dragging FROM
int m_nDropIndex; //Index at which to drop item in the List we are dropping ON
CWnd* m_pDropWnd; //Pointer to window we are dropping on (will be cast to CListCtrl* type)
void DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList);
private:
bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位
bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath);
void SendTransferMode();
void SendFileData();
void EndLocalUploadFile();
bool DeleteDirectory(LPCTSTR lpszDirectory);
void EnableControl(BOOL bEnable = TRUE);
float m_fScalingFactor;
public:
afx_msg void OnFilemangerCompress();
afx_msg void OnFilemangerUncompress();
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_)