Использование встроенных в Windows методов для получения содержимого папки - PullRequest
0 голосов
/ 22 октября 2019

Моя цель - использовать только встроенные методы C ++ / Windows (я не думаю, что std :: filesystem поддерживается в моей версии C ++), чтобы получить имена файлов в папке.

прямо сейчасУ меня есть это:

HANDLE hFind;
    WIN32_FIND_DATA data;
    hFind = FindFirstFile("C:\\Folder\\*", &data);
    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            //Process File Name
            std::wstring ws(data.cFileName);
        } while (FindNextFile(hFind, &data));
        FindClose(hFind);
    }

Что, кажется, возвращает пустые имена, а не имена файлов в папке.

Правильно ли я использую эту функцию FindFirstFile правильно? Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 22 октября 2019

Ваш код не может скомпилироваться, как показано. Вы вызываете ANSI-версию FindFirstFile() (в силу того, что вы передаете ему узкий строковый литерал ANSI вместо широкого строкового литерала Unicode), а std::wstring не имеет конструктора, который принимает char[] в качестве ввода.

Обнажая эту ошибку, вы также игнорируете поле data.dwFileAttributes, чтобы различать файлы и подпапки, а в случае подпапок вы не проверяете содержимое data.cFileName, чтобы игнорировать "." и * 1009. * специальные имена папок.

Попробуйте это:

WIN32_FIND_DATAW data;
HANDLE hFind = FindFirstFileW(L"C:\\Folder\\*", &data);
if (hFind != INVALID_HANDLE_VALUE)
{
    do
    {
        if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            // Process File Name
            std::wstring ws(data.cFileName);
            ...
        }
        else
        {
            if ((lstrcmpW(data.cFileName, L".") != 0) &&
                (lstrcmpW(data.cFileName, L"..") != 0))
            {
                // Process Folder Name
                std::wstring ws(data.cFileName);
                ...
            }
        }
    }
    while (FindNextFileW(hFind, &data));
    FindClose(hFind);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...