WIN32_FIND_DATA
является структурой.Проверьте cFileName
член.
Например:
WIN32_FIND_DATA FindData = {0};
HANDLE hFind = FindFirstFile(pszPattern, &FindData);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
PTSTR pszFileName = FindData.cFileName;
// TODO: Use pszFileName in some way...
} while (FindNextFile(hFind, &FindData));
FindClose(hFind);
}
Обновление в ответ на комментарии
В этом примере хранилище длястрока находится в стеке, и один и тот же буфер используется для каждого вызова.Это означает, что каждый FindNextFile()
перезаписывает предыдущую строку.Вам нужно будет сделать копию строки.
Поскольку вы используете C ++ и классы в std
, я предлагаю вам сохранить его в std::string
(или еще лучше, убедитесь, что вы определили UNICODE
и _UNICODE
и используйте wstring
.) Инициализация нового класса string
сделает выделение и копирование от вашего имени.
В качестве альтернативы вы можете скопировать строку, используя типичные методы C (например:malloc
+ memcpy
, strdup
или аналогичный), но звучит так, как будто вы, возможно, захотите освежить в строках, указателях и распределении памяти в C, прежде чем доберетесь до этого.
Кстати- чтобы проверить наличие ошибок, ваш код сравнивает дескриптор поиска с NULL
;это неверноFindFirstFile()
возвращает INVALID_HANDLE_VALUE
(что соответствует (HANDLE)-1
) в случае сбоя.Кроме того, чтобы закрыть ручку, вам нужно использовать FindClose()
, а не CloseHandle()
.(«Дескриптор поиска» на самом деле не является дескриптором объекта ядра в том же смысле, что дескриптор файла, дескриптор модуля или дескриптор потока или процесса. Они только что перегружены типом.)