一个通过深度优先方式遍历文件夹(包括子文件夹)的小算法

#include <windows.h>
#include <tchar.h>
#include <stack>

using namespace std;

//定义回调函数
typedef VOID(* FPTENUMCALLBACK)(LPCTSTR szFullPath, VOID *ptUser);

BOOL EnumDirectory(LPCTSTR szDirectoryPath, FPTENUMCALLBACK EnumCallBack, VOID *ptUser)
{
	if (NULL == szDirectoryPath || NULL == EnumCallBack)
	{
		return FALSE;
	}

	LPTSTR szBaseDirectory = new TCHAR[MAX_PATH * 2];
	if (NULL == szBaseDirectory)
	{
		return FALSE;
	}

	_tcscpy_s(szBaseDirectory, MAX_PATH * 2, szDirectoryPath);
	if (_T('\\') != szBaseDirectory[_tcslen(szBaseDirectory) - 1])
	{
		_tcscat_s(szBaseDirectory, MAX_PATH * 2, _T("\\"));
	}

	stack<LPTSTR> skTasklist;
	skTasklist.push(szBaseDirectory);

	HANDLE hFind = NULL;
	WIN32_FIND_DATA stFindData;

	//开始操作任务栈
	while (FALSE == skTasklist.empty())
	{
		LPTSTR szTask = skTasklist.top();
		skTasklist.pop();

		if (NULL == szTask)
		{
			continue;
		}

		_tcscat_s(szTask, MAX_PATH * 2, _T("*"));

		hFind = FindFirstFile(szTask, &stFindData);
		if (INVALID_HANDLE_VALUE == hFind)
		{
			delete[] szTask;
			continue;
		}

		do 
		{
			LPCTSTR szFileName = stFindData.cFileName;
			if(0 == _tcscmp(szFileName, _T(".")) || 0 == _tcscmp(szFileName, _T("..")))
			{
				continue;
			}

			LPTSTR szFullFileName = new TCHAR[MAX_PATH * 2];
			memset(szFullFileName, 0, sizeof(TCHAR) * MAX_PATH * 2);

			_tcscpy_s(szFullFileName, MAX_PATH * 2, szTask);
			_tcscpy_s(&(szFullFileName[_tcslen(szFullFileName) - 1]), MAX_PATH * 2 - _tcslen(szFullFileName) + 1, szFileName);

			EnumCallBack(szFullFileName, ptUser);		//调用回调函数

			if (stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if (_T('\\') != szFullFileName[_tcslen(szFullFileName) - 1])
				{
					_tcscat_s(szFullFileName, MAX_PATH * 2, _T("\\"));
				}
				skTasklist.push(szFullFileName);
			}
			else
			{
				delete[] szFullFileName;
			}
		} while (FindNextFile(hFind, &stFindData));

		delete[] szTask;
		FindClose(hFind);
	}
	return TRUE;
}
回调函数说明
typedef VOID(* FPTENUMCALLBACK)(LPCTSTR szFullPath, VOID *ptUser);

szFullPath : 文件夹中文件的全路径(包括文件夹的路径),不需要在回调函数中释放
ptUser : 一个用户自定义的指针,用来传递想传递的数据结构

使用方法:

定义一个回调函数:

VOID PrintAllFile(LPCTSTR szFullPath, VOID *ptUser)
{
	if(NULL == szFullPath)
	{
		return;
	}
	//输出所有内容
	cout << szFullPath << endl;		//默认窄字符
}

BOOL bError = EnumDirectory(TEXT("D:\\Workspace\\"), PrintAllFile, NULL);
if(FALSE == bError)
{
	cout << "遍历失败" << endl;
}
else
{
	cout << "遍历成功" << endl;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值