【发布时间】:2019-06-12 16:38:39
【问题描述】:
我有一小段代码旨在使用 Windows API 列出目录的内容。
代码:
#include <iostream>
#include <Windows.h>
int wmain() {
WIN32_FIND_DATA data;
std::string dir = "c:\\* ";
HANDLE hFind = FindFirstFileA(dir.c_str(), &data); // DIRECTORY
if (hFind != INVALID_HANDLE_VALUE) {
do {
std::cout << data.cFileName << std::endl;
} while (FindNextFileW(hFind, &data));
FindClose(hFind);
}
return 0;
}
错误:
Error C2664 'HANDLE FindFirstFileA(LPCSTR,LPWIN32_FIND_DATAA)': cannot convert argument 2 from 'WIN32_FIND_DATA *' to 'LPWIN32_FIND_DATAA'
错误会根据我的修复尝试而改变。我尝试了以下方法:
- 试图将
FindFirstFile更改为FindFirstFileW/FindNextFileA - 试图在目录字符串
L"C:\\*"前面放置一个L
我查看了以下相关问题:
- Listing directory contents using C and Windows
- How to list files in a directory using the Windows API?
但是没有让它成功列出内容。我得到的最接近的是这段代码,它编译时没有错误:
#include <windows.h>
#include <iostream>
int main()
{
WIN32_FIND_DATA data;
HANDLE hFind = FindFirstFileW(L"C:\\*", &data);
if (hFind != INVALID_HANDLE_VALUE) {
do {
std::cout << data.cFileName << std::endl;
} while (FindNextFileW(hFind, &data));
FindClose(hFind);
}
}
这可以编译,但是当我运行二进制文件时,它会输出:
0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C 0000009A9DBAF32C
在我们讨论的过程中,FindNextFile、FindNextFileA 和 FindNextFileW 之间有什么区别?我觉得这个问题在某种程度上与这些有关?
【问题讨论】:
-
使用 std::wcout 代替。