文件搜索

前几天的作业,在这里做个备份,同时也记录一点关于文件搜索的方法.

作业的内容是编写一个基于对话框的应用程序,可以打开一个文件并浏览该文件下面的所有文件(树型控件)显示.

文件的代码如下:

1. 利用shell打开系统的文件资源代码

BROWSEINFO  bi;
 bi.hwndOwner=NULL;
 bi.pidlRoot=NULL;
 bi.pszDisplayName=NULL;
 bi.lpszTitle=NULL;
 bi.ulFlags=0;
 bi.lpfn =NULL;
 bi.iImage =0;
 LPCITEMIDLIST pidl=SHBrowseForFolder(&bi);
 if(!pidl)
  return;
char FilePath[MAX_PATH];
 SHGetPathFromIDList(pidl,FilePath);
 m_Path=FilePath;
 UpdateData(FALSE); 

该文件名字被保存在 m_Path中,接着树型控件的文件遍历,可以采用msdn中的代码稍微改写即可.

void CMmDlg::Recurse(CString FilePath,CString FileName ,HTREEITEM hParent)
{
 TV_ITEM tvItem;
 TV_INSERTSTRUCT tvInsert;
 tvItem.mask=TVIF_TEXT|TVIF_PARAM;
 tvItem.pszText=(LPSTR)(LPCSTR)FileName;
 tvInsert.hParent=hParent;
 tvInsert.hInsertAfter=TVI_LAST;
 tvInsert.item=tvItem;
 HTREEITEM hNewParent=m_FileTree.InsertItem(&tvInsert);
 
 CFileFind finder;
 CString strWildcard(FilePath);
 strWildcard+=_T("//*.*");
 BOOL bWorking=finder.FindFile(strWildcard);
 while (bWorking)
 {
  bWorking=finder.FindNextFile();

  if (finder.IsDots())
  {
   continue;
  }

  if (finder.IsDirectory())
  {
   CString str = finder.GetFilePath();
   CString theFileName = finder.GetFileName();
   Recurse(str,theFileName,hNewParent);
  }
  else
  {
   CString str=finder.GetFileName();
   TV_ITEM FiletvItem;
   TV_INSERTSTRUCT FiletvInsert;
   FiletvItem.mask=TVIF_TEXT|TVIF_PARAM;
   FiletvItem.pszText=(LPSTR)(LPCSTR)str;
   FiletvInsert.hParent=hNewParent;
   FiletvInsert.hInsertAfter=TVI_LAST;
   FiletvInsert.item=FiletvItem;
   m_FileTree.InsertItem(&FiletvInsert);

  }
 }
 finder.Close();
}

主消息代码,调用

 m_FileTree.DeleteAllItems();
 
 CString AdjustPath;
 if(m_Path.GetLength()==3)
 {
  AdjustPath=m_Path.Left(2);
 }
 else
 {
  AdjustPath=m_Path;
 }
 Recurse(AdjustPath,AdjustPath,TVI_ROOT);

由此我们即可完成该功能.但是由于是递归,所以程序的性能将不怎么好,尤其是当搜索的目录比较大的时候,很有可能耗尽系统的堆寨,这里我们还得好好思考思考!因此可以将递归写成堆寨,这样效率能够提高,但是可读性就没有递归那么显而易见了.大家自己选择吧~~有机会我也弄上一个贴上来,呵呵

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值