c++ - 在windows下用c++列出目录

标签 c++ c windows directory listings

我想列出当前目录的所有文件,所以我有这段代码:

int WLoader::listdir(void)
{
    WIN32_FIND_DATA data;
    std::wstring path(L"*");
    std::wstring *name;
    HANDLE hFile = FindFirstFile(path.c_str(), &data);

    if  (hFile == INVALID_HANDLE_VALUE)
       return (-1);

    while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES)
    {
        std::cout << data.cFileName << std::endl;
    }
    return (0);
}

由于未知原因,我的程序显示了这个结果:

0029F29C
0029F29C
0029F29C
0029F29C
0029F29C
0029F29C

有人可以帮帮我吗?

最佳答案

The WIN32_FIND_DATA structure's member cFileName is a TCHAR[N] , 和 TCHAR is a Windows type alias that maps either to char or wchar_t.问题是,您在编写代码时不知道会是哪一个

根据您的build设置,您可以使用 char*wchar_t*;一个应该与 std::cout 一起使用,另一个必须与 std::wcout 一起使用。但是你用哪一个?!

幸运的是,有一个宏可以在编译时找出正在使用的宏:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
#ifdef UNICODE
   std::wcout << data.cFileName << std::endl;
#else
   std::cout << data.cFileName << std::endl;
#endif
}

如果您尝试将文件名分配给 std::string/std::wstring,您会发现同样的问题。这就是使用 Windows API 的好处。 :)


解决此问题的一种方法是为输出流和字符串定义宏。

因此,在程序顶部的某处:

#ifdef UNICODE
#define STDCOUT std::wcout
#define STDSTR  std::wstring
#else
#define STDCOUT std::cout
#define STDSTR  std::string
#endif

那么在你的函数中,你只需要:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
   STDCOUT << data.cFileName << std::endl;
}

并且您可以在别处使用 STDSTR

需要考虑的事情。

关于c++ - 在windows下用c++列出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702543/

相关文章:

c++ - 具有多维数组错误的简单 C++ 程序?

Visual Studio 中的 C 程序

c - 用于快速查询的整数 vector 散列

windows - 检查是否安装了 Windows 镜像组件(wic 注册表)

windows - 如何使用 Powershell 查找、停止和禁用 Windows 服务

c++ - 从未达到打开枚举后的保护代码

c++ - CStrings 初始化和使用 vector 的 vector

c++ - C++ 中的函数对象自动检测类型

c - 我的 C 程序生成不需要的输出

c++ - 来自 D3D 显示适配器 ID 的描述性监视器名称