如何将WIN32_FIND_DATA转换为字符串?

时间:2010-07-30 21:24:33

标签: c++ windows

我使用WIN32_FIND_DATA存储数据findfirstfile输出。我希望文件位置(C:\文件)作为字符串,但我不知道如何从它获取它或任何其他数据。

编辑:这是我的代码

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 个答案:

答案 0 :(得分:6)

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()都会覆盖前一个字符串。你必须复制一个字符串。

由于您在std中使用了C ++和类,我建议您将其存储在std::string中(或者更好,请确保定义UNICODE_UNICODE并使用wstring。)初始化新的string课程将代表您进行分配和复制。

或者,您可以使用典型的C技术复制字符串(例如:使用malloc + memcpystrdup或类似技术),但听起来您可能需要复习一下在进入之前,在C中的字符串,指针和内存分配。

顺便说一下 - 要检查错误,您的代码会将查找句柄与NULL进行比较;这是不正确的。 FindFirstFile()在失败时返回INVALID_HANDLE_VALUE(适用于(HANDLE)-1)。此外,要关闭句柄,您需要使用FindClose(),而不是CloseHandle()。 (“查找句柄”实际上并不是内核对象的句柄,与文件句柄,模块句柄或线程或进程句柄相同。它们只是重载了类型。)

答案 1 :(得分:1)

问题是您要在文件中存储文件名的地址。每次调用FindNextFile()时,它都会将结构中的数据替换为下一个文件的信息。您需要为数组中的字符串分配内存,然后将结构中的字符串复制到数组中(可能使用类似strncpy_s()的内容)。

您的代码只是存储指向结构的文件名成员的指针,每个找到的文件一次。如果你看一下数组中每个元素指向的地址,它们都指向同一个地方。