设为首页 加入收藏

TOP

5.4.2 获取系统文件目录结构(2)
2013-10-07 00:47:47 来源: 作者: 【 】 浏览:53
Tags:5.4.2 获取 系统 文件 目录 结构

5.4.2  获取系统文件目录结构(2)

在这两个函数内实现功能都能达到我们的目的,那么应该如何选择呢?不难看出NM_CLICK是鼠标左键每单击一次就会响应一次操作,保证了每次单击都会展现目录结构,也就是说如果对同一个路径连续单击5次,那么就要执行相同的操作5次,因此这种操作的响应会造成资源浪费,而TVN_SELCHANGED是在项目发生变化的时候改变响应相关操作,这个相对NM_CLICK要节省一些资源。在此笔者选定使用TVN_SELCHANGED。

控件的使用问题解决了,下面继续我们的编码工作。

在CFilesAssistantDlg类中再次增加一个private的函数。

private:
CString m_strSearchPath;//搜索路径
private:
//获取子目录结构
void GetSubDirectories(LPNMTREEVIEW pNMTreeView);
增加该函数的实现。
const wchar_t PATH_SPACER[] = L"\\";//路径分隔符
///////////////////////////////////////////////////////////////////
//函数名称:GetSubDirectories
//函数介绍:
//   获取子目录结构
//输入参数:
//   pNMTreeView:一个用于传递消息的内容的结构体指针,
//   传递了TVN_SELCHANGED携带的消息内容
//输出参数:
//   无
//返回值:
//   无
///////////////////////////////////////////////////////////////////
void CFilesAssistantDlg::GetSubDirectories(LPNMTREEVIEW pNMTreeView)
{
//为没有打开的文件建立下级列表
HTREEITEM hTreeItem = pNMTreeView->itemNew.hItem;


//查找选定目录下的内容

//组合查询条件
wchar_t* strSearchPath = new wchar_t[MAX_PATH];
strSearchPath[0] = L'\0';

//组合完整路径,向上组合
wcscpy(strSearchPath, m_tcDirectories.GetItemText(hTreeItem));
wcscat(strSearchPath, PATH_SPACER);
HTREEITEM hTreeItemTemp = m_tcDirectories.GetParentItem(hTreeItem);
wchar_t* strTemp = new wchar_t[MAX_PATH];
while(NULL!=hTreeItemTemp)
{
wcscpy(strTemp, m_tcDirectories.GetItemText(hTreeItemTemp));
wcscat(strTemp, PATH_SPACER);
wcscat(strTemp, strSearchPath);
wcscpy(strSearchPath, strTemp);
hTreeItemTemp = m_tcDirectories.GetParentItem(hTreeItemTemp);
}

m_strSearchPath = strSearchPath;//复制到成员变量,用于文件列表
m_strSearchPath.Replace(L"\\\\", L"\\");
//增加过滤条件,由于是选择目录因此使用"*.*"
wchar_t strFileName[] = L"*.*";//选择所有的文件
wcscat(strSearchPath, strFileName);

//判定是否存在子项
BOOL bItemHasChildren = m_tcDirectories.ItemHasChildren(hTreeItem);
if (bItemHasChildren)
{
return;
}
//开始查找
WIN32_FIND_DATA FindData;//用于存储找到的文件
HANDLE hFind;//存储用于查找的句柄

hFind = FindFirstFile(strSearchPath, &FindData);

delete[] strSearchPath;
if (INVALID_HANDLE_VALUE == hFind)
{
return ;
}

//存在目录
m_lcFiles.DeleteAllItems();//清空文件列表
do
{
//添加目录
if (FILE_ATTRIBUTE_DIRECTORY == (FindData.dwFileAttributes&     FILE_ATTRIBUTE_DIRECTORY))
{
//不添加"."和".."
if ((0==wcscmp(L".", FindData.cFileName)) ||
(0==wcscmp(L"..", FindData.cFileName)))
{
continue;
}

//添加目录
m_tcDirectories.InsertItem(FindData.cFileName, hTreeItem);
}
}while( FindNextFile(hFind, &FindData));
FindClose(hFind);

m_tcDirectories.Expand(hTreeItem, TVE_EXPAND);
m_tcDirectories.SortChildren(hTreeItem);
}


添加函数的调用。

void CFilesAssistantDlg::OnTvnSelchanged
TreeDirectories(NMHDR *pNMHDR,  LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
//获取目录结构
GetSubDirectories(pNMTreeView);
}

运行并测试执行情况,如图5-17所示。

获取目录中的文件列表。

首先来初始化用于显示文件列表的控件,在这个控件中增加标题栏。

在CFilesAssistantDlg中增加用于初始化标题栏的函数。

FilesAssistantDlg.h
 
(点击查看大图)图5-17  显示目录结构

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.4.2 获取系统文件目录结构(3) 下一篇5.4.4 文件类别(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: