Win32 API: переполнение стека в функции рекурсивного поиска файлов в C - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать программу, которая должна:

  • Поиск указанного c файла путем перехода в каталог и его подкаталоги (рекурсивно)

Но я вроде запутался, у меня переполнение стека. Вот функция, которая доставляет мне неприятности:

BOOL LoopThroughDirectories(LPTSTR fileName)
{
    //Searching for files that matches in the current directory
    WIN32_FIND_DATA ffd;
    HANDLE hFirstFile = FindFirstFile(fileName, &ffd);

    if (hFirstFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            //If it's not a directory
            if (ffd.dwFileAttributes & FILE_ATTRIBUTE_NORMAL)
            {
                _tprintf("%s\n", ffd.cFileName);
            }
        } while (FindNextFile(hFirstFile, &ffd));
    }

    FindClose(hFirstFile);

    //Go into the first unexplored directory
    HANDLE hFirstDir = FindFirstFile(_T("*"), &ffd);

    if (hFirstDir != INVALID_HANDLE_VALUE)
    {
        do
        {
            //If it's a directory
            if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                //Go into it 
                SetCurrentDirectory(ffd.cFileName);
                //and do the same
                LoopThroughDirectories(fileName);
                SetCurrentDirectory(_T(".."));
            }
        } while (FindNextFile(hFirstDir, &ffd));
    }
    FindClose(hFirstDir);
    return TRUE;
}

Вот моя основная функция:

int _tmain(int argc, LPCTSTR argv[])
{
    //Parsing the command line arguments

    //Processing the fileName
    LPTSTR tempPath;
    LPTSTR fileName;

    //Checking for emptyness
    if (argc == 2)
    {
        tempPath = argv[1];
    }

    else
    {
        //If empty set filename to *
        tempPath = _T("*");
    }

    //Removing trailing backslash if any
    LPTSTR backSlash = _tcsrchr(tempPath, _T("\\"));

    if (backSlash != NULL)
    {
        //Replacing backslash with terminating null character
        *backSlash = _T("\0");
    }

    fileName = tempPath;

    //Looping through directories
    LoopThroughDirectories(fileName);

    return EXIT_SUCCESS;
}

Вот исключение, которое мне дал VS Debugger (я говорю по-французски извините):

Исключение не указано: 0x77382358 (ntdll.dll) dans lsW.exe: 0xC00000FD: переполнение стека (параметры: 0x00000001, 0x00802FE C).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...