📄 filemgr.cpp
字号:
// filemgrview.cpp: implementation of the CFileMgr class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "common.h"
#include "ntshell.h"
#include "sockmgr1.h"
#include "inputdlg.h"
#include "filemgr.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileMgr::CFileMgr() : m_path(this, 1)
{
strcpy(szCurPath, "C:\\");
}
CFileMgr::~CFileMgr()
{
}
LRESULT CFileMgr::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
pwip = (PWND_INIT_PARAM)lParam;
connwait = false;
slave_sock = INVALID_SOCKET;
filelist = NULL;
SortColumn = 0;
ClipboardOperation = 0;
SizeSortOrder[0] = 0;
SizeSortOrder[1] = 1;
SizeSortOrder[2] = 2;
SizeSortOrder[3] = 3;
SizeSortOrder[4] = 4;
SizeSortOrder[5] = 5;
TBBUTTON tbButtons[] = {
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
{0, ID_FILEMGR_BACK, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{1, ID_FILEMGR_FORWARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{2, ID_FILEMGR_TOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
{3, ID_FILEMGR_RELOAD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
};
CBitmap bmp;
CImageList m_ImageList;
bmp.LoadBitmap(IDB_BITMAP1);
m_ImageList.Create(22, 22, ILC_COLOR24 | ILC_MASK, 4, 0);
m_ImageList.Add(bmp, RGB(192, 192, 192));
bmp.DeleteObject();
m_hToolBar.Attach(GetDlgItem(IDC_FILETOOLBAR));
m_hToolBar.SetButtonStructSize();
//m_hToolBar.AddBitmap(sizeof(tbButtons) / sizeof(TBBUTTON), IDB_BITMAP1);
m_hToolBar.SetImageList(m_ImageList);
m_hToolBar.AddButtons(sizeof(tbButtons) / sizeof(TBBUTTON), tbButtons);
m_hToolBar.SetStyle(m_hToolBar.GetStyle() | TBSTYLE_TRANSPARENT | TBSTYLE_FLAT | CCS_NODIVIDER | CCS_NORESIZE);
m_hPathList.Attach(GetDlgItem(IDC_PATHLIST));
m_hPathList.ModifyStyle(0, CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL);
m_path.SubclassWindow(FindWindowEx(GetDlgItem(IDC_PATHLIST), NULL, "Edit", NULL));
m_hFileList.Attach(GetDlgItem(IDC_FILELIST));
m_hFileList.InsertColumn(0, "名称", LVCFMT_LEFT, 200, 0);
m_hFileList.InsertColumn(1, "大小", LVCFMT_LEFT, 150, 0);
m_hFileList.InsertColumn(2, "属性", LVCFMT_LEFT, 50, 0);
m_hFileList.InsertColumn(3, "修改时间", LVCFMT_LEFT, 150, 0);
SHFILEINFO sfi;
ITEMIDLIST *m_pidlDesk;
HIMAGELIST hImageList;
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &m_pidlDesk);
hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)m_pidlDesk, 0, &sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_ICON);
hImageList = m_hFileList.SetImageList(hImageList, LVSIL_NORMAL);
ImageList_Destroy(hImageList);
hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)m_pidlDesk, 0, &sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
hImageList = m_hFileList.SetImageList(hImageList, LVSIL_SMALL);
ImageList_Destroy(hImageList);
RECT rect;
REBARBANDINFO rbbi;
m_hToolBar.GetWindowRect(&rect);
rbbi.cbSize = sizeof(REBARBANDINFO);
rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBS_BREAK;
rbbi.fStyle = RBBS_NOVERT | RBBS_CHILDEDGE;
rbbi.hwndChild = m_hToolBar;
rbbi.cxMinChild = 200;
rbbi.cyMinChild = rect.bottom - rect.top + 2;
m_ReBar.Attach(GetDlgItem(IDC_FILEREBAR));
m_ReBar.ModifyStyle(0, CCS_NODIVIDER | CCS_NOPARENTALIGN | RBS_VARHEIGHT | RBS_BANDBORDERS);
m_ReBar.InsertBand(-1, &rbbi);
m_hPathList.GetWindowRect(&rect);
rbbi.hwndChild = m_hPathList;
rbbi.cxMinChild = rect.right - rect.left;
rbbi.cyMinChild = 15;
m_ReBar.InsertBand(-1, &rbbi);
// DWORD dwStyle = m_hFileList.GetExtendedListViewStyle();
// dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP;
// m_hFileList.SetExtendedListViewStyle(dwStyle);
::ShowWindow(GetDlgItem(IDC_GOTO), SW_HIDE);
return TRUE;
}
LRESULT CFileMgr::OnSocketRead(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
int ret = RecvPack();
if (ret == SOCKMGR_PENDING)
return 0;
if (ret == SOCKMGR_SOCK_FAILED)
{
char *p = GetErrorString();
MessageBox(p, "", MB_ICONERROR);
LocalFree(p);
}
if (ret == SOCKMGR_SUCCESS)
{
ULONG nDataSize = GetBufferDataSize();
PBYTE pData = (PBYTE)HeapAlloc(GetProcessHeap(), 0, nDataSize);
if (pData != NULL)
{
ReadBuffer((char *)pData, nDataSize);
ParseDataPack(pData, nDataSize);
HeapFree(GetProcessHeap(), 0, pData);
}
}
return 0;
}
LRESULT CFileMgr::OnSocketWrite(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
int ret = SendPack();
if (ret == SOCKMGR_SOCK_FAILED)
{
char *p = GetErrorString();
MessageBox(p, "", MB_ICONERROR);
LocalFree(p);
}
return 0;
}
LRESULT CFileMgr::OnConnOk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
connwait = false;
return 0;
}
LRESULT CFileMgr::OnConnTimeOut(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
connwait = false;
MessageBox("连接失败", "FileMgr", MB_ICONERROR);
return 0;
}
LRESULT CFileMgr::OnConnectCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
SetSocket((SOCKET)wParam);
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = FILEMGR_LISTDRIVE;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
FlushBuffer();
return 0;
}
LRESULT CFileMgr::OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
SetSocket(INVALID_SOCKET);
return 0;
}
LRESULT CFileMgr::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{/*
RECT rcRB, rcDL;
m_ReBar.SendMessage(WM_SIZE);
m_ReBar.GetWindowRect(&rcRB);
m_ReBar.MoveWindow(0, 0, LOWORD(lParam), rcRB.bottom - rcRB.top);
m_hPathList.SendMessage(WM_SIZE);
m_hPathList.GetWindowRect(&rcDL);
m_hPathList.MoveWindow(7, 7 + rcRB.bottom - rcRB.top, LOWORD(lParam) - 14, 180);
int y = rcRB.bottom - rcRB.top + rcDL.bottom - rcDL.top;
m_hFileList.MoveWindow(7, 14 + y, LOWORD(lParam) - 14, HIWORD(lParam) - 21 - y);//*/
m_ReBar.MoveWindow(0, 0, LOWORD(lParam), HIWORD(lParam));
int y = m_ReBar.GetBarHeight() + m_ReBar.GetBandCount();
m_hFileList.MoveWindow(7, 7 + y, LOWORD(lParam) - 14, HIWORD(lParam) - 14 - y);
return TRUE;
}
LRESULT CFileMgr::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
m_hFileList.SetImageList(NULL, LVSIL_NORMAL);
m_hFileList.SetImageList(NULL, LVSIL_SMALL);
ImageList_Destroy(m_hToolBar.SetImageList(NULL));
m_ReBar.Detach();
m_hToolBar.Detach();
m_hPathList.Detach();
m_hFileList.Detach();
if (slave_sock != INVALID_SOCKET)
{
closesocket(slave_sock);
slave_sock = INVALID_SOCKET;
}
while (filelist != NULL)
{
PFILE_LIST p = filelist;
filelist = filelist->next;
delete []p;
}
return TRUE;
}
LRESULT CFileMgr::OnToolBarTop(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
SetCurrentPath("..");
return 0;
}
LRESULT CFileMgr::OnToolBarReload(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
SetCurrentPath(szCurPath);
return 0;
}
LRESULT CFileMgr::OnPathSelect(int code, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
char szRootPath[] = "C:\\";
switch (code)
{
case CBN_SELCHANGE:
szRootPath[0] = (char)m_hPathList.GetItemData(m_hPathList.GetCurSel());
m_hPathList.SetWindowText(szRootPath);
SetCurrentPath(szRootPath);
break;
}
return 0;
}
LRESULT CFileMgr::OnFileSelect(int wParam, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
{
NMLISTVIEW *pNMListView = (NMLISTVIEW *)pNMHDR;
int nItem = pNMListView->iItem;
char szFilePath[MAX_PATH];
HMENU hMenu, hPopupMenu;
POINT point;
switch (pNMHDR->code)
{
case LVN_COLUMNCLICK:
SortColumn = pNMListView->iSubItem;
SizeSortOrder[SortColumn] = ~SizeSortOrder[SortColumn];
m_hFileList.SortItems(CompareFunc, (LPARAM)SizeSortOrder[SortColumn]);
break;
case NM_DBLCLK:
if (nItem >= 0 && nItem < m_hFileList.GetItemCount())
{
PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);
if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
SetCurrentPath(pfl->fileinfo.FileName);
}
else
{
wsprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
SendCommand(FILEMGR_SIMPLYREADFILE, szFilePath);
}
}
break;
case NM_RCLICK:
hMenu = LoadMenu(GetModuleHandle(NULL), (LPCTSTR)IDR_SUBMENU);
if (nItem == -1)
{
hPopupMenu = GetSubMenu(hMenu, 3);
}
else
{
PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);
if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
hPopupMenu = GetSubMenu(hMenu, 4);
}
else
{
hPopupMenu = GetSubMenu(hMenu, 2);
if (ClipboardOperation == 0)
EnableMenuItem(hPopupMenu, IDM_FILE_PASTE, MF_GRAYED);
}
}
GetCursorPos(&point);
TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN, point.x, point.y, 0, m_hWnd, NULL);
DestroyMenu(hMenu);
break;
}
return 0;
}
LRESULT CFileMgr::OnComboChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
TCHAR chCharCode = (TCHAR)wParam;
CString msg;
switch (chCharCode)
{
case '/':
case '*':
case '?':
case '"':
case '<':
case '>':
case '|':
msg.Format("无效路径字符'%c'", chCharCode);
MessageBox(msg, "错误", MB_ICONERROR);
break;
default:
bHandled = FALSE;
break;
}
return 0;
}
LRESULT CFileMgr::OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (m_hFileList.GetSelectedCount() != 1)
{
MessageBox("一次只能打开一个文件!", "错误", MB_ICONERROR);
return 0;
}
int nItem = m_hFileList.GetSelectedIndex();
if (nItem == -1)
return 0;
PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);
if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return 0;
char szFilePath[MAX_PATH];
sprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
SendCommand(FILEMGR_SIMPLYREADFILE, szFilePath);
return 0;
}
LRESULT CFileMgr::OnFileExecute(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (m_hFileList.GetSelectedCount() != 1)
{
MessageBox("一次执行下载一个文件!", "错误", MB_ICONERROR);
return 0;
}
int nItem = m_hFileList.GetSelectedIndex();
if (nItem == -1)
return 0;
PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);
if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return 0;
char szFilePath[MAX_PATH];
sprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
SendCommand(FILEMGR_EXECUTEFILE, szFilePath);
return 0;
}
LRESULT CFileMgr::OnFileCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (GetSelectedFileName(ClipboardData, true))
ClipboardOperation = 1;
return 0;
}
LRESULT CFileMgr::OnFileCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (GetSelectedFileName(ClipboardData, true))
ClipboardOperation = 2;
return 0;
}
LRESULT CFileMgr::OnFilePaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
FILEMGR_FILENAME2 fn;
if (ClipboardOperation == 1)
{
if (MessageBox("确定要移动文件?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
return 0;
}
int b = 0, f = 0;
for (;;)
{
f = ClipboardData.Find('|', b);
if (f == -1)
break;
CString newFile = szCurPath;
CString fileName = ClipboardData.Mid(b, f - b);
newFile += "\\";
int i = fileName.ReverseFind('\\');
newFile += fileName.Mid(i, fileName.GetLength() - i);
strcpy(fn.FileName1, fileName);
strcpy(fn.FileName2, newFile);
switch (ClipboardOperation)
{
case 1:
SendCommandEx(FILEMGR_MOVEFILE, &fn, sizeof(FILEMGR_FILENAME2));
break;
case 2:
SendCommandEx(FILEMGR_COPYFILE, &fn, sizeof(FILEMGR_FILENAME2));
break;
}
b = f + 1;
}
SetCurrentPath(szCurPath);
return 0;
}
LRESULT CFileMgr::OnFileDownload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (m_hFileList.GetSelectedCount() != 1)
{
MessageBox("一次只能下载一个文件!", "错误", MB_ICONERROR);
return 0;
}
return 0;
}
LRESULT CFileMgr::OnFileUpload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -