遍历文件夹并建成目录树

前些日子,我在做程序中遇到这样一个问题,要用树型控件快速浏览指定文 件夹中的文件,经过一番周折,终于做出来了,想到有些仁兄可能遇到和我相同 的困难,所以将我的做法写出来,希望对大家有些帮助!

(本文程序运行效果图)

基本原理是用了函数的递归调用,再加入参数跟踪。我在调试程序的时候,跟踪发现:程序只有在遍历完一个目录下所有子目录后,才返回同级的目录。这 样便可以用参数的值来决定目录的层次。

(1)在对话框上添加树型控件,选择Style中Has Buttons、Has Lines、Lines At Root。

(2)定义变量:

HTREEITEM strRoot; //根目录
HTREEITEM strHTFir; //第一层
HTREEITEM strHTSec; //第二层
HTREEITEM strHtThi; //第三层
HTREEITEM strHtFor; //第四层
HTREEITEM strHtFif; //第五层
// 没有找到更好的方法,所以只能这样来显示,估计一下大约能用到几层,如 果找到好方法,请告诉我,非常感谢!
HTREEITEM strHtEnd; //文件目录
(3)添加遍历文件夹的函数 BrowseFile(int CallNum, CString strFile)

//CalNum-用来记录第几层目录,strFile-路径

并添加以下内容:

void CFileTreeDlg::BrowseFile(int CallNum, CString strFile)
{
  CallNum++;
  CFileFind ff;
  CString szDir = strFile;
  
  if(szDir.Right(1) != "\\")
    szDir += "\\";
  
  szDir += "*.*";
  
  BOOL res = ff.FindFile(szDir);
  while(res)
  {
    res = ff.FindNextFile();
    if(ff.IsDirectory() && !ff.IsDots())//目录是文件夹
    {
      //如果是一个子目录,用递归继续往深一层找
      CString strPath = ff.GetFilePath(); //得到路径,做为递归 调用的开始
      CString strTitle = ff.GetFileTitle(); //得到目录名,做为 树控的结点
      int i =0;
      switch(CallNum)
      {
        case 1:
          strHTFir = m_FileTree.InsertItem (strTitle,0,0,NULL);
          break;
        case 2:
          strHTSec = m_FileTree.InsertItem (strTitle,0,0,strHTFir);
          break;
        case 3:
          strHtThi = m_FileTree.InsertItem (strTitle,0,0,strHTSec);
          break;
        case 4:
          strHtFor = m_FileTree.InsertItem (strTitle,0,0,strHtThi);
          break;
        default:
          strHtFif = m_FileTree.InsertItem (strTitle,0,0,strHtFor);
          break;
      }
      BrowseFile(CallNum,strPath); //递归调用
    }
    else if(!ff.IsDirectory() && !ff.IsDots())//到达最低层 的文件
    {
      //显示当前访问的文件
      CString strPath;
      CString strTitle;
      strPath = ff.GetFilePath();
      strTitle = ff.GetFileTitle();
      switch(CallNum)
      {
      case 1:
        strRoot = m_FileTree.InsertItem(strTitle,0,0,NULL);
        break;
      case 2:
        strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHTFir);
        break;
      case 3:
        strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHTSec);
        break;
      case 4:
        strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtThi);
        break;
      case 5:
        strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtFor);
        break;
      default:
        strHtEnd = m_FileTree.InsertItem (strTitle,0,0,strHtFif);
        break;
      }
    }
  }
  ff.Close(); //关闭
}
(4)在OnInitDialog()函数中设置树控件的图标并调用自定义函数 BrowseFile()BOOL CFileTreeDlg::OnInitDialog()
{
  m_iImageList.Create(24, 24, TRUE,1, 0); //创建图标链
  HICON hIcon = NULL;
  hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDI_KEBIAO), IMAGE_ICON, 24, 24, 0);
  m_iImageList.Add(hIcon);
  m_FileTree.SetImageList ( &m_iImageList,TVSIL_NORMAL );
  BrowseFile(0,"课程表"); //遍历"课程表"文件夹 内的所有目录
}

本文配套源码

时间: 2024-11-01 15:33:41

遍历文件夹并建成目录树的相关文章

改进《遍历文件夹并建成目录树》

刚刚看到VC知识库二十期中的一篇文章<遍历文件夹并建成目录树>.主要 是用一个递归函数来扫描目标文件夹,但是这个函数还存在目录层数的限制. 我写了另外一个函数,实现的结果跟上文一模一样,但消除了目录层数的限 制, 原代码与改进后的代码如下: //原来的函数原型void CFileTreeDlg::BrowseFile(int CallNum, CString strFile) { CallNum++; CFileFind ff; CString szDir = strFile; if(szDi

Android 遍历SDCARD的文件夹并显示目录信息

Android 遍历SDCARD的文件夹并显示目录信息 private String mResult = new String(); private String[] mFileList = null; 1).显示所有文件/ File flist = new File("/mnt/sdcard"); mFileList = flist.list(); for(String str: mFileList){ mResult += str; mResult += "\n"

asp.net遍历文件夹目录和文件实现程序

方法一  代码如下 复制代码 private void forFileLength(DirectoryInfo directory)  {  DirectoryInfo[] directorys = directory.GetDirectories();  FileInfo[] files;  foreach (DirectoryInfo di in directorys)  {  forFileLength(di);  }  files = directory.GetFiles();  for

关于递归遍历文件夹的问题,求大神们指教。

问题描述 关于递归遍历文件夹的问题,求大神们指教. 递归遍历文件夹中的内容已经可以实现.但是有个问题不会解决.求大神们帮忙.比如说一个文件夹(一级目录)里面还有多个文件夹(二级目录),二级目录里面包含各种文件. 我想获取各个二级目录,以及二级目录里面的文件,该如何获取.求大神指点! 解决方案 不知道你是什么语言,说下思路吧:假设你获取文件夹内文件的方法叫search,传递参数为文件夹路径: 1传递根目录到search方法,遍历每个文件: 2判断每个文件是文件还是文件夹,是文件加入列表,是文件夹将

PHP遍历文件夹与文件类及处理类用法实例

  本文实例讲述了PHP遍历文件夹与文件类及处理类用法,非常具有实用价值.分享给大家供大家参考.具体方法如下: FindFile.class.php类文件用于遍历目录文件,具体代码如下: <?php /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class FindFile{ public $files = array(); // 存储遍历的文件 protected $maxdepth; // 搜寻深度,0表示

PHP遍历文件夹及文件类及处理类

FindFile.class.php 用于遍历目录文件 <?php /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class FindFile{ public $files = array(); // 存储遍历的文件 protected $maxdepth; // 搜寻深度,0表示没有限制 /* 遍历文件及文件夹 * @param String $spath 文件夹路径 * @param int $maxdep

ASP.NET2.0 遍历文件夹下所有图片

asp.net|遍历|遍历文件 1.以下目录有若干图片(都是大图片)2.在页面展现效果图 3.代码 后台代码using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;us

C++中如何深度搜索遍历文件夹

深度优先搜索遍历文件夹所有文件, 由于使用windows的函数, 必须要使用C语言; 注意字符集的问题,使用"#undef UNICODE", 屏蔽因字符集所产生的问题; 使用vector<string>存储所有文件名, 因为要递归使用, 所以需要设置为静态,返回shared_ptr的指针 代码如下: /************************************************* File: main.cpp Copyright: C.L.Wang A

收集的多个ruby遍历文件夹代码实例

  这篇文章主要介绍了收集的多个ruby遍历文件夹代码实例,本文总结了4个代码片段,小编推荐最后一个方法,因为它很简洁优雅,需要的朋友可以参考下 一.遍历文件夹下所有文件,输出文件名 代码如下: def traverse_dir(file_path) if File.directory? file_path Dir.foreach(file_path) do |file| if file !="." and file !=".." traverse_dir(file