非递归遍历目录

深度优先:内存低 (宽字符有问题)

#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;
}

猜你喜欢

转载自blog.51cto.com/haidragon/2376204