如何将WIN32_FIND_DATA转换为string?

即时通讯使用WIN32_FIND_DATA存储数据findfirstfile输出。 我想文件的位置(C:\文件)作为一个string,但我不知道如何得到它或任何其他数据。

编辑:这是我的代码

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); } 

WIN32_FIND_DATA是一个结构体。 cFileNamecFileName成员。

例如:

 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() 。 (一个“查找句柄”实际上不是一个内核对象的句柄,就像一个文件句柄,一个模块的句柄或者一个线程或者进程句柄一样,它们只是重载了这个类型)。

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

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