www.pudn.com > ntshell.rar > 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; 
 
	if (chCharCode >= 'a' && chCharCode <= 'z') 
	{ 
		bHandled = FALSE; 
		return 0; 
	} 
 
	if (chCharCode >= 'A' && chCharCode <= 'Z') 
	{ 
		bHandled = FALSE; 
		return 0; 
	} 
 
	if (chCharCode >= '0' && chCharCode <= '9') 
	{ 
		bHandled = FALSE; 
		return 0; 
	} 
 
	if (chCharCode == ':' || chCharCode == '\\') 
	{ 
		bHandled = FALSE; 
		return 0; 
	} 
 
	bHandled = TRUE; 
	CString msg; 
	msg.Format("无效路径字符'%c'", chCharCode); 
	MessageBox(msg, "错误", MB_ICONERROR); 
 
	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; 
} 
 
LRESULT CFileMgr::OnFileDelete(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	CString fileList; 
 
	if (!GetSelectedFileName(fileList, true)) 
		return 0; 
 
	if (MessageBox("确定要删除文件?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO) 
		return 0; 
 
	int b = 0, f = 0; 
 
	for (;;) 
	{ 
		f = fileList.Find('|', b); 
 
		if (f == -1) 
			break; 
 
		SendCommand(FILEMGR_DELETEFILE, fileList.Mid(b, f - b)); 
		b = f + 1; 
	} 
 
	SetCurrentPath(szCurPath); 
 
	return 0; 
} 
 
LRESULT CFileMgr::OnDirectoryCreate(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	CInputDlg dlg; 
	char szDirectoryName[INPUT_BUFFER_SIZE] = ""; 
 
	if (dlg.DoModal(m_hWnd, (LPARAM)szDirectoryName) == FALSE) 
		return 0; 
 
	CString path = szCurPath; 
	path += "\\"; 
	path += szDirectoryName; 
	SendCommand(FILEMGR_CREATEDIRECTORY, path); 
 
	SetCurrentPath(szCurPath); 
 
	return 0; 
} 
 
LRESULT CFileMgr::OnDirectoryRemove(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	if (m_hFileList.GetSelectedCount() != 1) 
	{ 
		MessageBox("一次只能删除一个目录!", "错误", MB_ICONERROR); 
		return 0; 
	} 
 
	int nItem = m_hFileList.SendMessage(LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); 
 
	PFILE_LIST p = (PFILE_LIST)m_hFileList.GetItemData(nItem); 
 
	if (!(p->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
		return 0; 
 
	if (MessageBox("确定要删除目录?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO) 
		return 0; 
 
	CString path = szCurPath; 
	path += "\\"; 
	path += p->fileinfo.FileName; 
	SendCommand(FILEMGR_REMOVEDIRECTORY, path); 
 
	SetCurrentPath(szCurPath); 
 
	return 0; 
} 
 
LRESULT CFileMgr::OnGoto(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/) 
{ 
	m_hPathList.GetWindowText(szCurPath, MAX_PATH); 
	SetCurrentPath(szCurPath); 
 
	return 0; 
} 
 
int CALLBACK CFileMgr::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
{ 
	PFILE_LIST pfile1 = (PFILE_LIST)lParam1; 
	PFILE_LIST pfile2 = (PFILE_LIST)lParam2; 
	int nResult, nSortColumn = lParamSort < 0 ? ~lParamSort : lParamSort; 
 
	if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
	{ 
		nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY); 
		return lParamSort < 0 ? nResult : -nResult; 
	} 
 
	switch (nSortColumn) 
	{ 
	case 0: 
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName); 
		break; 
 
	case 1: 
		if (pfile1->fileinfo.FileSizeHigh != pfile2->fileinfo.FileSizeHigh) 
		{ 
			nResult = pfile1->fileinfo.FileSizeHigh - pfile2->fileinfo.FileSizeHigh; 
			break; 
		} 
		if (pfile1->fileinfo.FileSizeLow != pfile2->fileinfo.FileSizeLow) 
		{ 
			nResult = pfile1->fileinfo.FileSizeLow - pfile2->fileinfo.FileSizeLow; 
			break; 
		} 
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName); 
		break; 
 
	case 2: 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_READONLY); 
			break; 
		} 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_HIDDEN); 
			break; 
		} 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_SYSTEM); 
			break; 
		} 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ARCHIVE); 
			break; 
		} 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_ENCRYPTED); 
			break; 
		} 
		if ((pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED) != (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED)) 
		{ 
			nResult = (pfile1->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED) - (pfile2->fileinfo.FileAttributes & FILE_ATTRIBUTE_COMPRESSED); 
			break; 
		} 
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName); 
		break; 
 
	case 3: 
		if (pfile1->fileinfo.LastWriteTime.dwHighDateTime != pfile2->fileinfo.LastWriteTime.dwHighDateTime) 
		{ 
			nResult = pfile1->fileinfo.LastWriteTime.dwHighDateTime - pfile2->fileinfo.LastWriteTime.dwHighDateTime; 
			break; 
		} 
		if (pfile1->fileinfo.LastWriteTime.dwLowDateTime != pfile2->fileinfo.LastWriteTime.dwLowDateTime) 
		{ 
			nResult = pfile1->fileinfo.LastWriteTime.dwLowDateTime - pfile2->fileinfo.LastWriteTime.dwLowDateTime; 
			break; 
		} 
		nResult = stricmp(pfile1->fileinfo.FileName, pfile2->fileinfo.FileName); 
		break; 
	} 
 
	return lParamSort < 0 ? -nResult : nResult; 
} 
 
void CFileMgr::ParseDataPack(LPBYTE pData, ULONG nDataSize) 
{ 
	PNTSHELL_RESULTSET rs = (PNTSHELL_RESULTSET)pData; 
	CString str; 
	PBYTE p = pData + sizeof(NTSHELL_RESULTSET); 
	ULONG l = nDataSize - sizeof(NTSHELL_RESULTSET); 
 
	if (rs->ErrorCode != ERROR_SUCCESS) 
	{ 
		LPVOID lpMsgBuf; 
 
		FormatMessage(	FORMAT_MESSAGE_ALLOCATE_BUFFER | 
						FORMAT_MESSAGE_FROM_SYSTEM | 
						FORMAT_MESSAGE_IGNORE_INSERTS, 
						NULL, 
						rs->ErrorCode, 
						0, 
						(LPTSTR)&lpMsgBuf, 
						0, 
						NULL 
						); 
 
		MessageBox((LPTSTR)lpMsgBuf, "", MB_ICONERROR); 
		LocalFree(lpMsgBuf); 
		return; 
	} 
 
	if (rs->ResultClass == FILEMGR_LISTDRIVE) 
	{ 
		int count = 0; 
		PFILEMGR_DRIVEINFO pdi; 
 
		m_hPathList.ResetContent(); 
 
		for (int i = 0; i < (int)rs->NumberOfResults; i++) 
		{ 
			pdi = ((PFILEMGR_DRIVEINFO)p) + i; 
 
			str.Format("%s (%c:)", pdi->VolumeName, pdi->RootPathName[0]); 
			m_hPathList.InsertString(i, str); 
			m_hPathList.SetItemData(i, pdi->RootPathName[0]); 
		} 
 
		char szRootPath[] = "C:\\"; 
		m_hPathList.SetCurSel(0); 
		szRootPath[0] = (char)m_hPathList.GetItemData(0); 
		m_hPathList.SetWindowText(szRootPath); 
		SetCurrentPath(szRootPath); 
	} 
	else if (rs->ResultClass == FILEMGR_LISTFILE) 
	{ 
		int count = 0; 
		PFILEMGR_FILEINFO pfi; 
 
		for (ULONG i = 0; i < l && count < (int)rs->NumberOfResults; count++) 
		{ 
			pfi = (PFILEMGR_FILEINFO)(p + i); 
 
			PFILE_LIST p = (PFILE_LIST)new BYTE[sizeof(FILE_LIST) + strlen(pfi->FileName) + 1]; 
			p->fileinfo = *pfi; 
			strcpy(p->fileinfo.FileName, pfi->FileName); 
			p->next = filelist; 
			filelist = p; 
 
			char *pExtName = strrchr(p->fileinfo.FileName, '.'); 
			int nImage = GetIconIndex(pExtName, TRUE, p->fileinfo.FileAttributes); 
			m_hFileList.InsertItem(LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM, count, pfi->FileName, 0, 0, nImage, (LPARAM)p); 
 
			if (!(pfi->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
			{ 
				char buf[20]; 
				ULONG fsh = pfi->FileSizeHigh >> 10; 
				ULONG fsl = (pfi->FileSizeLow >> 10) | (pfi->FileSizeHigh << 22); 
				if (pfi->FileSizeLow % 1024) {fsl += 1; if (fsl == 0) fsh += 1;} 
				NumGrouping(buf, fsh, fsl, 14); 
				str = buf; 
				str += " KB"; 
				m_hFileList.SetItemText(count, 1, str); 
			} 
 
			str = ""; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_READONLY) 
				str += 'R'; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_HIDDEN) 
				str += 'H'; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_SYSTEM) 
				str += 'S'; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_ARCHIVE) 
				str += 'A'; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_ENCRYPTED) 
				str += 'E'; 
			if (pfi->FileAttributes & FILE_ATTRIBUTE_COMPRESSED) 
				str += 'C'; 
			m_hFileList.SetItemText(count, 2, str); 
 
			SYSTEMTIME stime; 
			FILETIME ftime; 
			FileTimeToLocalFileTime(&pfi->LastWriteTime, &ftime); 
			FileTimeToSystemTime(&ftime, &stime); 
			str.Format("%d-%02d-%02d %02d:%02d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute); 
			m_hFileList.SetItemText(count, 3, str); 
			i += sizeof(FILEMGR_FILEINFO) + strlen(pfi->FileName) + 1; 
		} 
 
		m_hFileList.SortItems(CompareFunc, (LPARAM)SizeSortOrder[SortColumn]); 
	} 
	else if (rs->ResultClass == FILEMGR_SIMPLYREADFILE) 
	{ 
		PFILEMGR_FILEREAD pfr = (PFILEMGR_FILEREAD)p; 
		char szTempFile[MAX_PATH]; 
 
		GetTempPath(MAX_PATH, szTempFile); 
		strcat(szTempFile, pfr->FileName); 
 
		HANDLE hFile = CreateFile(szTempFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); 
 
		if (hFile != INVALID_HANDLE_VALUE) 
		{ 
			for (ULONG i = 0; i < pfr->FileSize;) 
			{ 
				ULONG nWriteBytes; 
				if (!WriteFile(hFile, pfr->FileData + i, pfr->FileSize - i, &nWriteBytes, NULL)) 
					break; 
				i += nWriteBytes; 
			} 
 
			CloseHandle(hFile); 
 
//			STARTUPINFO si = {0}; 
//			PROCESS_INFORMATION pi; 
 
//			si.cb			= sizeof(STARTUPINFO); 
//			si.lpDesktop	= "WinSta0\\Default"; 
//			si.dwY			= 1; 
//			si.dwXSize		= 100; 
//			si.dwYSize		= 100; 
//			si.wShowWindow	= SW_SHOWNORMAL; 
 
//			if (!CreateProcess(szTempFile, pfr->cFileName, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 
//			{ 
				if (!ShellExecute(NULL, "open", szTempFile, NULL, NULL, SW_SHOWNORMAL)) 
					MessageBox("文件已传送完成,但无法打开"); 
//			} 
//			else 
//			{ 
//				CloseHandle(pi.hProcess); 
//				CloseHandle(pi.hThread); 
//			} 
		} 
	} 
} 
 
void CFileMgr::NumGrouping(char *buf, unsigned int hival, unsigned int loval, int width) 
{ 
	unsigned int c, d, i, temp; 
	char *p; 
 
	p = buf + width; 
	*p = '\0'; 
	goto mod; 
	do 
	{ 
		if (i++ == 2) 
		{ 
			*--p = ','; 
mod: 
			i = 0; 
		} 
 
		if (hival) 
		{ 
			c = hival % 10; 
			hival /= 10; 
			c = (c << 16) + (loval >> 16); 
			d = c / 10; 
			c %= 10; 
			c = (c << 16) + (loval & 0xffff); 
			temp = c % 10; 
			loval = (d << 16) + c / 10; 
		} 
		else 
		{ 
			temp = (unsigned int)loval % 10; 
			loval /= 10; 
		} 
		*--p = temp + '0'; 
	} while (loval || hival); 
 
	while (p > buf) 
		*--p = ' '; 
} 
 
void CFileMgr::CleanupFileList() 
{ 
	m_hFileList.DeleteAllItems(); 
 
	while (filelist != NULL) 
	{ 
		PFILE_LIST p = filelist; 
		filelist = filelist->next; 
		delete []p; 
	} 
} 
 
int CFileMgr::GetIconIndex(const char *lpExtName, BOOL bSmallIcon, DWORD dwFileAttributes) 
{ 
	SHFILEINFO shfi; 
	int nImage; 
 
	DWORD dwFlags = SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES; 
	dwFlags |= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON; 
 
	nImage = SHGetFileInfo(lpExtName, dwFileAttributes, &shfi, sizeof(SHFILEINFO), dwFlags); 
 
	return shfi.iIcon; 
} 
 
void CFileMgr::SetCurrentPath(const char *lpPath) 
{ 
	char szFilePath[280]; 
 
	if (lpPath[1] == ':') 
	{ 
		strcpy(szCurPath, lpPath); 
	} 
	else if (lpPath[0] == '.' && lpPath[1] == '.') 
	{ 
		char *p = strrchr(szCurPath, '\\'); 
 
		if (p - szCurPath > 3) 
			p[0] = '\0'; 
		else 
			p[1] = '\0'; 
	} 
	else 
	{ 
		if (strlen(szCurPath) > 3) 
			strcat(szCurPath, "\\"); 
		strcat(szCurPath, lpPath); 
	} 
 
	CleanupFileList(); 
 
	strcpy(szFilePath, szCurPath); 
 
	if (szCurPath[strlen(szCurPath) - 1] == '\\') 
		strcat(szFilePath, "*.*"); 
	else 
		strcat(szFilePath, "\\*.*"); 
 
	SendCommand(FILEMGR_LISTFILE, szFilePath); 
	m_hPathList.SetWindowText(szCurPath); 
} 
 
int CFileMgr::SendCommand(DWORD dwCommand, const char *lpPath) 
{ 
	NTSHELL_REQUEST req; 
 
	req.ClientVersion = 1; 
	req.Reserved = 0; 
	req.RequestClass = (WORD)dwCommand; 
	req.Reserved2 = 0; 
 
	WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); 
	WriteBuffer(lpPath, strlen(lpPath) + 1); 
 
	FlushBuffer(); 
 
	int ret = SendPack(); 
 
	if (ret == SOCKMGR_SOCK_FAILED) 
		MessageBox("连接不可用", "错误", MB_ICONERROR); 
 
	return ret; 
} 
 
int CFileMgr::SendCommandEx(DWORD dwCommand, const void *lpData, int cbData) 
{ 
	NTSHELL_REQUEST req; 
 
	req.ClientVersion = 1; 
	req.Reserved = 0; 
	req.RequestClass = (WORD)dwCommand; 
	req.Reserved2 = 0; 
 
	WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); 
	WriteBuffer((char *)lpData, cbData); 
 
	FlushBuffer(); 
 
	int ret = SendPack(); 
 
	if (ret == SOCKMGR_SOCK_FAILED) 
		MessageBox("连接不可用", "错误", MB_ICONERROR); 
 
	return ret; 
} 
 
bool CFileMgr::GetSelectedFileName(CString &str, bool bIncludePath) 
{ 
	int nItem = -1; 
 
	str = ""; 
 
	for (;;) 
	{ 
		nItem = m_hFileList.SendMessage(LVM_GETNEXTITEM, (WPARAM)nItem, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); 
 
		if (nItem == -1) 
			break; 
 
		PFILE_LIST p = (PFILE_LIST)m_hFileList.GetItemData(nItem); 
 
		if (p->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
			continue; 
 
		if (bIncludePath) 
		{ 
			str += szCurPath; 
			str += "\\"; 
		} 
 
		str += p->fileinfo.FileName; 
		str += "|"; 
	} 
 
	return true; 
}