本人写了一个遍历本机磁盘文件目录的一个程序,碰到一个这样的问题,我把它在C盘下运行,它就从C盘根目录下开始,我把它放在D盘运行,它就从D盘开始,...。我想从整个系统的根目录开始,即不管我把该程序放到哪个盘下,它最开始的目录都是C盘,D盘,...。哪位大侠有相关经验的说说我的程序大概是哪里有误?
程序关键代码如下:
BOOL CDlgPath::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here CWinApp* pApp = AfxGetApp();
HTREEITEM hItemRoot;
HIMAGELIST hImlSys;
SHFILEINFO ssfi;
CWaitCursor wait;
TCHAR szRoot[] = _T("\\");
//设置图标
hImlSys = (HIMAGELIST)SHGetFileInfo(_T("dummy.txt"), 0, &ssfi,
sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_imlSystem.Attach(hImlSys);
m_treeCtrl.SetImageList(&m_imlSystem, TVSIL_NORMAL);
m_imlSystem.Detach();
hItemRoot = TVI_ROOT;//m_treeFolder.InsertItem(GetSystemName(), 0, 1);
if(hItemRoot) //创建了根节点
{
TVINSERTSTRUCT tvi;
int iIcon = GetIconIndex(szRoot);
tvi.hParent = TVI_ROOT; //the item is inserted at the root of the tree-view control
tvi.hInsertAfter = TVI_LAST; //Inserts the item at the end of the list
tvi.item.mask = TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = szRoot;
tvi.item.iImage = iIcon;
tvi.item.iSelectedImage = iIcon;
tvi.item.cChildren = I_CHILDRENCALLBACK;
tvi.item.lParam = -1;
m_treeCtrl.InsertItem(&tvi);
}
// 除非将焦点设置到控件,否则返回 TRUE
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}void CDlgPath::OnItemexpandingTreePath(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(pNMTreeView->action & TVE_EXPAND)
{
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_PARAM;
item.hItem = pNMTreeView->itemNew.hItem;
if(pNMTreeView->itemNew.lParam == -1)
{
CString strFullPath = GetFullPath(item.hItem); //获取路径
RECT rc;
if(EnumDirs(strFullPath, _T("*"), item.hItem)) //非0成功
item.lParam = 1;
else
item.lParam = 0;
m_treeCtrl.SetItem(&item);
m_treeCtrl.GetItemRect(item.hItem, &rc, FALSE);
m_treeCtrl.InvalidateRect(&rc);
m_treeCtrl.UpdateWindow();
}
}
*pResult = 0;
}CString CDlgPath::GetFullPath(HTREEITEM hItem)
{
CString strFullPath,
strFolder,
strSep(_T("\\"));
if(hItem)
{
while(hItem)
{
strFolder = m_treeCtrl.GetItemText(hItem);
if(strFolder != strSep)
strFullPath = strFolder + strSep + strFullPath;
hItem = m_treeCtrl.GetParentItem(hItem);
}
strFullPath = strSep + strFullPath;
}
return strFullPath;
}int CDlgPath::EnumDirs(LPCTSTR pszPath, LPCTSTR pszFilter, HTREEITEM hItemParent)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
BOOL bFind;
HTREEITEM hItem = TVI_LAST;
CString strSearch(pszPath),strBase(pszPath);
int nCount = 0; //列举个数
ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));
strSearch += pszFilter;
bFind=((hFind = FindFirstFile(strSearch, &fd)) != INVALID_HANDLE_VALUE); //fd.dwFileAttributes==1为文件夹,否则为文件
while (bFind)
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
{
TVINSERTSTRUCT tvi;
CString strSub(strBase);
int iIcon;
strSub += fd.cFileName;
/*M_editPath=strSub;*/
/* m_editCtr.SetDlgItemText(IDC_EDIT_PATH,M_editPath);*/
/*PathToPrint=strSub;*/
iIcon = GetIconIndex(strSub); //找到图标
tvi.hParent = hItemParent;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = fd.cFileName;
tvi.item.iImage = iIcon;
tvi.item.iSelectedImage = iIcon;
tvi.item.cChildren = I_CHILDRENCALLBACK;
tvi.item.lParam = -1;
hItem = m_treeCtrl.InsertItem(&tvi); //插入树节点
++nCount;
}
bFind=FindNextFile(hFind, &fd);
}
return nCount;
}int CDlgPath::GetIconIndex(LPCTSTR pszFileName) //获取文件夹图标
{
SHFILEINFO ssfi;
SHGetFileInfo(pszFileName, 0, &ssfi, sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
return ssfi.iIcon;
}
程序关键代码如下:
BOOL CDlgPath::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here CWinApp* pApp = AfxGetApp();
HTREEITEM hItemRoot;
HIMAGELIST hImlSys;
SHFILEINFO ssfi;
CWaitCursor wait;
TCHAR szRoot[] = _T("\\");
//设置图标
hImlSys = (HIMAGELIST)SHGetFileInfo(_T("dummy.txt"), 0, &ssfi,
sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_imlSystem.Attach(hImlSys);
m_treeCtrl.SetImageList(&m_imlSystem, TVSIL_NORMAL);
m_imlSystem.Detach();
hItemRoot = TVI_ROOT;//m_treeFolder.InsertItem(GetSystemName(), 0, 1);
if(hItemRoot) //创建了根节点
{
TVINSERTSTRUCT tvi;
int iIcon = GetIconIndex(szRoot);
tvi.hParent = TVI_ROOT; //the item is inserted at the root of the tree-view control
tvi.hInsertAfter = TVI_LAST; //Inserts the item at the end of the list
tvi.item.mask = TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = szRoot;
tvi.item.iImage = iIcon;
tvi.item.iSelectedImage = iIcon;
tvi.item.cChildren = I_CHILDRENCALLBACK;
tvi.item.lParam = -1;
m_treeCtrl.InsertItem(&tvi);
}
// 除非将焦点设置到控件,否则返回 TRUE
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}void CDlgPath::OnItemexpandingTreePath(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(pNMTreeView->action & TVE_EXPAND)
{
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_PARAM;
item.hItem = pNMTreeView->itemNew.hItem;
if(pNMTreeView->itemNew.lParam == -1)
{
CString strFullPath = GetFullPath(item.hItem); //获取路径
RECT rc;
if(EnumDirs(strFullPath, _T("*"), item.hItem)) //非0成功
item.lParam = 1;
else
item.lParam = 0;
m_treeCtrl.SetItem(&item);
m_treeCtrl.GetItemRect(item.hItem, &rc, FALSE);
m_treeCtrl.InvalidateRect(&rc);
m_treeCtrl.UpdateWindow();
}
}
*pResult = 0;
}CString CDlgPath::GetFullPath(HTREEITEM hItem)
{
CString strFullPath,
strFolder,
strSep(_T("\\"));
if(hItem)
{
while(hItem)
{
strFolder = m_treeCtrl.GetItemText(hItem);
if(strFolder != strSep)
strFullPath = strFolder + strSep + strFullPath;
hItem = m_treeCtrl.GetParentItem(hItem);
}
strFullPath = strSep + strFullPath;
}
return strFullPath;
}int CDlgPath::EnumDirs(LPCTSTR pszPath, LPCTSTR pszFilter, HTREEITEM hItemParent)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
BOOL bFind;
HTREEITEM hItem = TVI_LAST;
CString strSearch(pszPath),strBase(pszPath);
int nCount = 0; //列举个数
ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));
strSearch += pszFilter;
bFind=((hFind = FindFirstFile(strSearch, &fd)) != INVALID_HANDLE_VALUE); //fd.dwFileAttributes==1为文件夹,否则为文件
while (bFind)
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
{
TVINSERTSTRUCT tvi;
CString strSub(strBase);
int iIcon;
strSub += fd.cFileName;
/*M_editPath=strSub;*/
/* m_editCtr.SetDlgItemText(IDC_EDIT_PATH,M_editPath);*/
/*PathToPrint=strSub;*/
iIcon = GetIconIndex(strSub); //找到图标
tvi.hParent = hItemParent;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = fd.cFileName;
tvi.item.iImage = iIcon;
tvi.item.iSelectedImage = iIcon;
tvi.item.cChildren = I_CHILDRENCALLBACK;
tvi.item.lParam = -1;
hItem = m_treeCtrl.InsertItem(&tvi); //插入树节点
++nCount;
}
bFind=FindNextFile(hFind, &fd);
}
return nCount;
}int CDlgPath::GetIconIndex(LPCTSTR pszFileName) //获取文件夹图标
{
SHFILEINFO ssfi;
SHGetFileInfo(pszFileName, 0, &ssfi, sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
return ssfi.iIcon;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货