// FilesAssistantDlg.h : 头文件
//
#pragma once
#include "afxcmn.h"
......
private:
//初始化逻辑分区
void InitPath(void);
// 文件目录
CTreeCtrl m_tcDirectories;
CString m_strSearchPath;//搜索路径
//获取子目录结构
void GetSubDirectories(LPNMTREEVIEW pNMTreeView);
CListCtrl m_lcFiles;//出错了!!!!
void OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR,
LRESULT *pResult);
// FilesAssistantDlg.cpp : 实现文件
/
.........
////////////////////////////////////////////////////////////////////////////////////
//函数名称:InitPath
//函数介绍:
// 初始化逻辑分区,
//输入参数
//
//输出参数
//
//返回值
//
/////////////////////////////////////////////////////////////////////////////////////
void CFilesAssistantDlg::InitPath(void)
{
wchar_t *pLogicalDrivers = new wchar_t[MAX_PATH];//申请用于存储结果的缓冲区
pLogicalDrivers[0] = '\0';//初始化空字符串
int nLen = GetLogicalDriveStrings(MAX_PATH-1, pLogicalDrivers);
//获取逻辑分区列表
if (0==nLen)
{
//无结果则退出函数
return;
}
int nDriverNameLength = wcslen(L"C:\\")+1;//格式为"C:\",末尾还有一个表示结束的空字符
int i = 0;
//在IDC_TREE_DIRECTORIES显示结果,即田间树形控件的内容
TVINSERTSTRUCT tvInsertItem;
tvInsertItem.hParent = NULL;
tvInsertItem.hInsertAfter = NULL;
tvInsertItem.item.mask = TVIF_TEXT;
do
{
tvInsertItem.item.pszText = pLogicalDrivers+i;
m_tcDirectories.InsertItem(&tvInsertItem);//目录树中增加逻辑分区
i += nDriverNameLength;
}while(i<nLen);
delete[] pLogicalDrivers;//回收缓冲区
}
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::OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR,
LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
//获取目录结构
GetSubDirectories(pNMTreeView);
}