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

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

作者:miao baoli

下载本文示例工程

刚刚看到VC知识库二十期中的一篇文章《遍历文件夹并建成目录树》。主要是用一个递归函数来扫描目标文件夹,但是这个函数还存在目录层数的限制。
我写了另外一个函数,实现的结果跟上文一模一样,但消除了目录层数的限制, 原代码与改进后的代码如下:

//原来的函数原型

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();//关闭
}
//原来的函数调用
BOOL CFileTreeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE); // Set big icon
	SetIcon(m_hIcon, FALSE); // Set small icon

	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,"成绩表");	//遍历"成绩表"文件夹内的所有目录

	return TRUE;
}
//改过后的函数原型
void CFileTreeDlg::BrowseDir( CString strDir, HTREEITEM parent )
{
	CFileFind ff;
	CString szDir = strDir;
	HTREEITEM hSubItem;

	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();

			hSubItem =
			m_FileTree.InsertItem( strTitle, 0, 0,parent );

			BrowseDir( strPath, hSubItem );
		}
		else if(!ff.IsDirectory() && !ff.IsDots())
		{
			CString strTitle = ff.GetFileTitle();

			m_FileTree.InsertItem( strTitle, 0, 0, parent );
		}

	}
	ff.Close();
}
//改过后的函数调用
BOOL CFileTreeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE); // Set big icon
	SetIcon(m_hIcon, FALSE); // Set small icon

	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 );
	BrowseDir( "成绩表", NULL );

	return TRUE;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值