深度优先:内存低 (宽字符有问题)
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stack>
#include <iostream>
using namespace std;
//定义回调函数
typedef VOID(*FPTENUMCALLBACK)(LPCTSTR szFullPath, VOID *ptUser);
VOID PrintAllFile(LPCTSTR szFullPath, VOID *ptUser)
{
if (NULL == szFullPath)
{
return;
}
//输出所有内容
printf("%s\n", szFullPath);
}
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, 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;
}
int main() {
BOOL bError = EnumDirectory( "F:\\svn\\trunk\\trunk\\bin\\tools\\CaptureReportSdk3.0\\Resource", PrintAllFile, NULL);
return 1;
}
广度优先:内存高
teststucrt.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <queue>
using namespace std;
queue<std::wstring> qFolders;
int QueryFileCounts(LPCTSTR Path)
{
qFolders.push(Path);
int fileCounts = 0;
WIN32_FIND_DATA findResult;
HANDLE handle = NULL;
while (qFolders.size() > 0)
{
std::wstring tempFolder = qFolders.front();
tempFolder.append(L"\\*.*");
handle = FindFirstFile(tempFolder.c_str(), &findResult);
do
{
if (findResult.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (lstrcmp(L".", findResult.cFileName) == 0 || lstrcmp(L"..", findResult.cFileName) == 0)
{
continue;
}
tempFolder = qFolders.front();
tempFolder.append(L"\\").append(findResult.cFileName);
printf("%ws\n", tempFolder);
qFolders.push(tempFolder);
}
else {
fileCounts++;
printf("%ws\n", tempFolder);
}
} while (FindNextFile(handle, &findResult));
qFolders.pop();
}
if (handle)
{
FindClose(handle);
handle = NULL;
}
return fileCounts;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*while (1)
{*/
//qFolders.clear();
cout << "文件个数:" << QueryFileCounts(L"F:\\svn\\trunk\\trunk\\bin\\tools") << endl;
//}
system("pause");
return 0;
}
转载于:https://blog.51cto.com/haidragon/2376204