Я пытаюсь показать файлы каталога рекурсивно, но получаю ошибку переполнения стека (я новичок в 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);
}
Сначала вы передаете имя каталога для рекурсивного поиска. Теперь для всех подкаталогов, вы пропустите .
а также ..
и передать оставшиеся каталог имя рекурсивно для этой функции.
Вы никогда не добавляете \*
к этому имени каталога, чтобы сделать его patter
рекурсивный поиск, что заставляет FindFirstFile возвращать сам этот каталог. (Поскольку каталог является единственным, который соответствует без шаблона.) И, следовательно, бесконечная рекурсия и переполнение стека.
Решение Вы должны добавить \*
до имени каталога, прежде чем позвонить вам getAllFiles
функционировать рекурсивно.
Вы только тестируете FindFirstFile
возвращаемое значение для INVALID_HANDLE_VALUE
, Может также вернуться ERROR_FILE_NOT_FOUND
,