我试图以递归方式显示目录文件,但是我收到了堆栈溢出错误(我是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);
}
答案 0 :(得分:5)
首先传递一个目录名,以便递归搜索。现在,对于所有子目录,您可以跳过.
和..
并将剩余的目录名称递归传递给此函数。
您永远不会将\*
添加到此目录名称,使其成为patter
递归搜索,这使得FindFirstFile返回此目录本身。 (因为目录是唯一没有模式匹配的目录。)因此无限递归和堆栈溢出。
解决方案在递归调用\*
函数之前,您应该将getAllFiles
附加到目录名称。
答案 1 :(得分:0)
您只测试FindFirstFile
的{{1}}返回值。它也可能会返回INVALID_HANDLE_VALUE
。