📄 filemgr.cpp
字号:
}
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<IDD_CREATEDIRECTORY> 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -