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); }
|