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

时间:2014-05-04 02:13:08

标签: c++ winapi directory 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);
 }

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

您只测试FindFirstFile的{​​{1}}返回值。它也可能会返回INVALID_HANDLE_VALUE