我使用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);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
更新以回应评论
在此示例中,字符串的存储位于堆栈上,并且每个调用使用相同的缓冲区.这意味着每次都会FindNextFile()覆盖前一个字符串.您必须复制该字符串.
由于您使用C++和类std我建议你将其存储在std::string(或更好,但请确保您定义UNICODE和_UNICODE和使用wstring.)初始化一个新的string类将做您的名义分配和复制.
或者,您可以使用典型的C技术复制字符串(例如:使用malloc+ memcpy,strdup或类似),但听起来您可能需要在C语言中重新编写字符串,指针和内存分配.
顺便说一句 - 检查错误,你的代码比较查找句柄NULL; 这是不正确的.失败时FindFirstFile()返回INVALID_HANDLE_VALUE(确定(HANDLE)-1).此外,要关闭手柄,您将需要使用FindClose(),而不是CloseHandle().("查找句柄"实际上并不是内核对象的句柄,与文件句柄,模块句柄或线程或进程句柄相同.它们只是重载了类型.)