首页 > 解决方案 > 如何在 Windows 中使用 FindNextFile 调用列出目录内容?

问题描述

我有一小段代码旨在使用 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'

错误会根据我的修复尝试而改变。我尝试了以下方法:

我查看了以下相关问题:

但没有得到它成功列出的内容。我得到的最接近的是这段代码,它编译时没有错误:

#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?我觉得这个问题与这些有关?

标签: c++windowswinapi

解决方案


FindNextFile是一个宏,根据是否定义 (and )解析为FindNextFileA(ANSI) 或(Unicode UTF16-LE )。FindNextFileWUNICODE_UNICODE

因此,您可以根据需要更改WIN32_FIND_DATAWIN32_FIND_DATAA参数FindFirstFileA的 ANSI 版本。

有关定义UNICODE和__UNICODE


推荐阅读