Не отображается первый файл при рекурсивном поиске в папке

Я написал код для того что-бы найти картинки в папке

bool find(std::string path, std::string need)
{
    std::string ppath = path + "\\" + need;
    WIN32_FIND_DATAA winFD;
    HANDLE hFile = FindFirstFileA(ppath.c_str(), &winFD);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        while (FindNextFileA(hFile, &winFD))
        {
            std::cout << "FILE:\t" << path + "\\" << winFD.cFileName << std::endl;
        }
    }
    return 0;
}

int main()
{
    setlocale(LC_ALL, "RUS");
    find("C:\\Users\\user\\Desktop\\png", "*.png");
}

Но при запуске выводит только 3-и файла а который идёт первый пропускает

введите сюда описание изображения

FILE:   C:\Users\user\Desktop\png\14.png
FILE:   C:\Users\user\Desktop\png\PPS.png
FILE:   C:\Users\user\Desktop\png\SMS.png

Как я могу сделать что бы выводилось вместе с 1-м файлом?


Ответы (1 шт):

Автор решения: Maxim Timakov

Так как первый файл находится вызовом функции FindFirstFile, то возможны два варианта исправления:

  • дублировать тело цикла перед его началом
  • переделать цикл на do { ... } while(...);

Дублирование кода зачастую вносит дополнительные ошибки, поэтому остановимся на цикле с постусловием:

HANDLE hFile = FindFirstFileA(ppath.c_str(), &winFD);

if (hFile == INVALID_HANDLE_VALUE)
{
    return false;
}

do
{
    // обработка файла
    std::cout << "FILE:\t" << path + "\\" << winFD.cFileName << std::endl;
}
while (FindNextFileA(hFile, &winFD));

// не забываем освобождать ресурсы
FindClose(hFile);

return true;
→ Ссылка