xxx.exe中0x77aa1f38处的未处理异常:0xC00000FD:堆栈溢出

Jac*_*ack 0 c++ directory winapi directory-listing

我试图以递归方式显示目录的文件,但是我收到了堆栈溢出错误(我是win32API的新手):

xxx.exe中0x77aa1f38处的未处理异常:0xC00000FD:堆栈溢出.

我该如何解决?

#include <windows.h>
#include <tchar.h> 
#include <stdio.h>
#include <strsafe.h>
#include <assert.h>
#include <string.h>

void getAllFiles(TCHAR *target_dir);

int _tmain(int argc, _TCHAR* argv[])
{
    getAllFiles(TEXT(".\\*"));
    getchar();
}

void getAllFiles(TCHAR *target_dir)
{
    WIN32_FIND_DATA ffd;
    TCHAR szDir[MAX_PATH] = {0};
    HANDLE hFind = INVALID_HANDLE_VALUE;
    DWORD dwError = 0;

    StringCchCopy(szDir, MAX_PATH, target_dir);
    hFind = FindFirstFile(szDir, &ffd);

    if(hFind == INVALID_HANDLE_VALUE)
    {
        printf("FindFirstFile");
        return;
    }

    do
    {

            if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if(_tccmp(ffd.cFileName, TEXT(".")) && _tccmp(ffd.cFileName, TEXT("..")))
                {
                    getAllFiles(ffd.cFileName);
                }
            }
            else
            {
                _tprintf(TEXT("%s\n"), ffd.cFileName);
            }

   }
   while (FindNextFile(hFind, &ffd) != 0);

   dwError = GetLastError();
   if (dwError != ERROR_NO_MORE_FILES) 
   {
      printf("FindFirstFile\n");
   }
    FindClose(hFind);
 }
Run Code Online (Sandbox Code Playgroud)

Moh*_*ain 5

首先传递一个目录名称以递归搜索.现在对于所有子目录,您跳过.并以递归方式..将剩余目录名传递给此函数.

您永远不会添加\*到此目录名称以使其patter以递归方式进行搜索,这使得FindFirstFile返回此目录本身.(因为目录是唯一没有模式匹配的目录.)因此无限递归和堆栈溢出.

解决方案您应该\*getAllFiles递归调用函数之前附加到目录名称.