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)
首先传递一个目录名称以递归搜索.现在对于所有子目录,您跳过.并以递归方式..将剩余目录名传递给此函数.
您永远不会添加\*到此目录名称以使其patter以递归方式进行搜索,这使得FindFirstFile返回此目录本身.(因为目录是唯一没有模式匹配的目录.)因此无限递归和堆栈溢出.
解决方案您应该\*在getAllFiles递归调用函数之前附加到目录名称.