手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

VC 中如何遍历整个目录树查找文档

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
在应用程式的研发过程中,经常会碰到如何查找某一文档以确定此文档路径的问题。利用CFileFind类能够比较方便地在当前目录下进行文档查找,但却不能对其子目录中的文档进行搜寻。而实际应用中往往需要对某一整个目录树,甚至是整个C盘或D盘驱动器进行文档搜寻。通过实践,我们在Visual C++ 6.0中编程实现了如何遍历任意目录树,以查找某一特定的文档。

  在下面的具体陈述中能够看到,在确定要查找的文档名和要进行搜索的目录的名称后,将调用函数Search_Directory进行文档的查找。首先依次查找当前目录下的每一个实体(文档或是子目录),假如是某一子目录,则进入该子目录并递归调用函数Search_Dirctory进行查找,查找完毕之后, 再返回上一级目录;假如不是子目录而是某一文档,则判断其是否就是我们要查找的文档,假如是则输出其完整的文档路径。这样,通过Search_Directory函数的反复递归调用,就能够实现对整个目录,包括子目录的遍历搜索。下面将举例周详讲述如何在VC++中编程实现在整个目录树中的文档查找。

  1.在Visual C++ 6.0(VC++ 5.0和之类似)中用默认方式创建了一基于对话框的应用程式Search。在主窗口对话框上放置一命令按钮,其Caption为“Search File”,ID为ID—BUTTON—SEARCH。单击此按钮将完成文档的查找工作。

  2.利用ClassWizard为“Search File”按钮的BN_CLICKED 事件添加处理函数OnButtonSearch,代码如下:

  #include 〈direct.h〉

  #include 〈io.h〉

  ......

  void CSearchDlg::OnButtonSearch()

  {

// TODO: Add your control notification handler code here

char szFilename[80];

  // 字符串 szFilename 表示要查找的文档名

strcpy(szFilename,″Mytext.txt″);

_chdir(″d:\\″); // 进入要查找的路径(也可为某一具体的目录)

  // 查找文档, 假如查到则显示文档的路径全名

Search_Directory(szFilename);

  // 为CSearchDlg类的一成员函数

MessageBox(″查找文档完毕!″);

  // 显示查找完毕的信息

  }

  3.在CSearchDlg类中增加成员函数Search_Directory,他将完成具体的文档查找工作,代码如下:

  void CSearchDlg::Search_Directory(char* szFilename)

  {

long handle;

struct _finddata_t filestruct;  

  //表示文档(或目录)的信息

char path_search[_MAX_PATH];

  //表示查找到的路径结果

  // 开始查找工作, 找到当前目录下的第一个实体(文档或子目录),

  // ″*″表示查找任何的文档或子目录, filestruct为查找结果

handle = _findfirst(″*″, &filestruct);

  // 假如handle为-1, 表示当前目录为空, 则结束查找而返回

if((handle == -1)) return;

  // 检查找到的第一个实体是否是个目录(filestruct.name为其名称)

if( ::GetFileAttributes(filestruct.name) & FILE—ATTRIBUTE—DIRECTORY )

{

  // 假如是目录, 则进入该目录并递归调用函数Search_Dirctory进行查找,

  // 注意: 假如目录名的首字符为′.′(即为″.″或″..″), 则不用进行查找

if( filestruct.name[0] != ′.′ )

{

—chdir(filestruct.name);

Search_Directory(szFilename);

  // 查找完毕之后, 返回上一级目录

—chdir(″..″);

}

}

else // 假如第一个实体不是目录, 则检查是否是要查找的文档

{

  // stricmp对两字符串进行小写形式的对比, 返回为0表示完全一致

if( !stricmp(filestruct.name, szFilename) )

{

  // 先获得当前工作目录的全路径

    —getcwd(path_search,—MAX—PATH);

  // 再获得文档的完整的路径名(包含文档的名称)

strcat(path_search,″\\″);

strcat(path—search,filestruct.name);

MessageBox(path_search); //输出显示

}

}

  // 继续对当前目录中的下一个子目录或文档进行和上面同样的查找

while(!(—findnext(handle,&filestruct)))

{

  if( ::GetFileAttributes(filestruct.name) & FILE—ATTRIBUTE—DIRECTORY )

{

if(*filestruct.name != ′.′)

{

—chdir(filestruct.name);

Search_Directory(szFilename);

—chdir(″..″);

}

}

else

{

if(!stricmp(filestruct.name,szFilename))

{

—getcwd(path—search,—MAX—PATH);

strcat(path_search,″\\″);

strcat(path_search,filestruct.name);

MessageBox(path_search);

}

}

}

—findclose(handle);

  // 最后结束整个查找工作

  }

  这样我们就能够对整个目录进行遍历搜索,查找某一特定的文档,并输出显示其完整的文档路径。以上的程式在Visual C++ 6.0中已调试通过。



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS