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