即时通讯使用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
是一个结构体。 cFileName
出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
+ memcpy
, strdup
或类似的方法)来复制字符串,但是听起来好像你可能需要在C中进行字符串,指针和内存分配的复习。
顺便说一句 – 检查错误,你的代码比较查找句柄与NULL
; 这是不正确的。 FindFirstFile()
)在失败时返回INVALID_HANDLE_VALUE
(解决(HANDLE)-1
)。 此外,要关闭句柄,您将需要使用FindClose()
,而不是CloseHandle()
。 (一个“查找句柄”实际上不是一个内核对象的句柄,就像一个文件句柄,一个模块的句柄或者一个线程或者进程句柄一样,它们只是重载了这个类型)。
问题是你要在你的数组中存储文件名的地址。 每次调用FindNextFile()
,都会将结构中的数据替换为下一个文件的信息。 您需要为数组中的字符串分配内存,然后将结构中的字符串复制到数组中(可能使用strncpy_s()
)。
您的代码只是将指针存储到结构的文件名成员,每找到一个文件。 如果你看看数组中的每个元素指向的地址,它们都指向相同的地方。