LoadFileInfo() 加载文件信息 并将其显示在一个树控件和列表控件中
这段代码是一个C++的MFC程序,用于加载文件信息并将其显示在一个树控件和列表控件中。以下是详细解释:
void CRemoteClientDlg::LoadFileInfo()
这个函数是 CRemoteClientDlg
类的一个成员函数,用于加载文件信息并显示在对话框中的控件里。
CPoint ptMouse;
GetCursorPos(&ptMouse);
m_Tree.ScreenToClient(&ptMouse);
CPoint ptMouse;
:定义一个CPoint
对象,用于存储鼠标的当前位置。GetCursorPos(&ptMouse);
:获取当前鼠标的屏幕坐标位置。m_Tree.ScreenToClient(&ptMouse);
:将屏幕坐标转换为树控件的客户端坐标。
HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);
if (hTreeSelected == NULL)
return;
HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);
:通过HitTest
函数,确定鼠标点击的树控件中的节点(项)。hTreeSelected
是点击项的句柄。- 如果
hTreeSelected
为NULL
,表示用户没有点击任何有效项,函数直接返回。
if (m_Tree.GetChildItem(hTreeSelected) == NULL)
return;
if (m_Tree.GetChildItem(hTreeSelected) == NULL)
:检查所选项是否有子项。如果没有子项,函数返回。
DeleteTreeChildrenItem(hTreeSelected);
DeleteTreeChildrenItem(hTreeSelected);
:删除所选项的所有子项。这是为了在加载新的文件信息前清除旧的子项。
m_List.DeleteAllItems();
m_List.DeleteAllItems();
:清空列表控件中的所有项目。
CString strPath = GetPath(hTreeSelected);
int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());
CString strPath = GetPath(hTreeSelected);
:获取当前选中项对应的路径。int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());
:发送一个命令包来请求获取选中路径下的文件信息。SendCommandPacket
函数的第一个参数2
可能表示请求类型,false
表示某种标志位,第三个参数是路径的字节指针,第四个参数是路径长度。
PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
CClientSocket* pClient = CClientSocket::getInstance();
PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
:通过CClientSocket
单例对象获取返回的包数据,并将其解释为文件信息结构体PFILEINFO
。CClientSocket* pClient = CClientSocket::getInstance();
:获取CClientSocket
的单例对象指针。
int Count = 0;
while (pInfo->HasNext) {
int Count = 0;
:初始化文件计数器。while (pInfo->HasNext)
:进入一个循环,处理每个文件信息项,直到pInfo->HasNext
为false
。
TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);
TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);
:输出当前文件名及其是否为目录的调试信息。
if (pInfo->IsDirectory) {
if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == ".."))
{
int cmd = pClient->DealCommand();
TRACE("ack:%d\r\n", cmd);
if (cmd < 0)break;
pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
continue;
}
HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);
m_Tree.InsertItem("", hTemp, TVI_LAST);
}
if (pInfo->IsDirectory)
:如果当前文件是一个目录。if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == ".."))
:如果目录名是 “.” 或 “…”,跳过处理(这些是当前目录和上级目录的表示)。int cmd = pClient->DealCommand();
:处理下一个命令包。pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
:获取下一个文件信息项。HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);
:在树控件中添加该目录项。m_Tree.InsertItem("", hTemp, TVI_LAST);
:在新添加的目录项下添加一个空白项,以表示该目录还有子目录或文件。
else {
m_List.InsertItem(0, pInfo->szFileName);
}
else
:如果当前项不是目录,而是文件。m_List.InsertItem(0, pInfo->szFileName);
:将文件名添加到列表控件中。
Count++;
int cmd = pClient->DealCommand();
if (cmd < 0)break;
pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
Count++;
:计数器加一。int cmd = pClient->DealCommand();
:处理下一个命令包。if (cmd < 0)break;
:如果处理命令返回负值,退出循环。pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
:获取下一个文件信息项。
pClient->CloseSocket();
TRACE("Count = %d\r\n", Count);
pClient->CloseSocket();
:关闭套接字连接。TRACE("Count = %d\r\n", Count);
:输出已处理文件的总数。
总结:这段代码的功能是处理用户在树控件中选择的目录项,然后通过网络请求获取该目录下的文件信息,并根据文件类型将信息分别显示在树控件和列表控件中。如果是目录项,将其添加到树控件中;如果是文件,将其添加到列表控件中。
void CRemoteClientDlg::LoadFileInfo()
{
CPoint ptMouse;
GetCursorPos(&ptMouse);
m_Tree.ScreenToClient(&ptMouse);
HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);
if (hTreeSelected == NULL)
return;
if (m_Tree.GetChildItem(hTreeSelected) == NULL)
return;
DeleteTreeChildrenItem(hTreeSelected);
m_List.DeleteAllItems();
CString strPath = GetPath(hTreeSelected);
int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());
PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
CClientSocket* pClient = CClientSocket::getInstance();
int Count = 0;
while (pInfo->HasNext) {
TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);
if (pInfo->IsDirectory) {
if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == ".."))
{
int cmd = pClient->DealCommand();
TRACE("ack:%d\r\n", cmd);
if (cmd < 0)break;
pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
continue;
}
HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);
m_Tree.InsertItem("", hTemp, TVI_LAST);
}
else {
m_List.InsertItem(0, pInfo->szFileName);
}
Count++;
int cmd = pClient->DealCommand();
//TRACE("ack:%d\r\n", cmd);
if (cmd < 0)break;
pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
}
pClient->CloseSocket();
TRACE("Count = %d\r\n", Count);
}