Как преобразовать WIN32_FIND_DATA в строку? - PullRequest
1 голос
/ 31 июля 2010

я использую WIN32_FIND_DATA для хранения данных в выходных данных findfirstfile. я хочу, чтобы местоположение файла (C: \ file) было строкой, но я не знаю, как получить его или какие-либо другие данные из него.

Редактировать: вот мой код

PTSTR pszFileName; 
PTSTR pszFileName2[100];
if (search_handle) 
{ 
    do 
    {
        pszFileName = file.cFileName;
        pszFileName2[loop] = pszFileName;
        Sleep(100);
        loop++;

        std::wcout << file.cFileName << std::endl;
    }
    while(FindNextFile(search_handle,&file)); 

    CloseHandle(search_handle); 
}

Ответы [ 2 ]

6 голосов
/ 31 июля 2010

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().(«Дескриптор поиска» на самом деле не является дескриптором объекта ядра в том же смысле, что дескриптор файла, дескриптор модуля или дескриптор потока или процесса. Они только что перегружены типом.)

1 голос
/ 31 июля 2010

Проблема в том, что вы храните адрес имени файла в вашем массиве. Каждый раз, когда вызывается FindNextFile(), он заменяет данные в структуре информацией для следующего файла. Вам нужно выделить память для строки в вашем массиве, а затем скопировать строку из структуры в ваш массив (используя что-то вроде strncpy_s(), вероятно).

Ваш код просто хранит указатель на имя файла члена структуры, один раз для каждого найденного файла. Если вы посмотрите на адрес, на который указывает каждый элемент массива, все они указывают на одно и то же место.

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