Необработанное исключение в 0x77aa1f38 в xxx.exe: 0xC00000FD: переполнение стека

Я пытаюсь показать файлы каталога рекурсивно, но получаю ошибку переполнения стека (я новичок в win32API):

Необработанное исключение в 0x77aa1f38 в xxx.exe: 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

Решение

Сначала вы передаете имя каталога для рекурсивного поиска. Теперь для всех подкаталогов, вы пропустите . а также .. и передать оставшиеся каталог имя рекурсивно для этой функции.

Вы никогда не добавляете \* к этому имени каталога, чтобы сделать его patter рекурсивный поиск, что заставляет FindFirstFile возвращать сам этот каталог. (Поскольку каталог является единственным, который соответствует без шаблона.) И, следовательно, бесконечная рекурсия и переполнение стека.

Решение Вы должны добавить \* до имени каталога, прежде чем позвонить вам getAllFiles функционировать рекурсивно.

5

Другие решения

Вы только тестируете FindFirstFile возвращаемое значение для INVALID_HANDLE_VALUE, Может также вернуться ERROR_FILE_NOT_FOUND,

0

По вопросам рекламы [email protected]