【问题标题】:Listing directories in c++ under windowswindows下c++列出目录
【发布时间】:2012-01-31 22:02:57
【问题描述】:

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

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

有人可以帮帮我吗?

【问题讨论】:

  • 它似乎正在输出 cFileName 元素的地址指针,而不是它包含的字符串。您是否尝试过只使用 printf() 代替?
  • 是的,它适用于 printf,但我需要将 cFileName 转换为字符串,因为我需要它来打开 dll。所以我想如果我不能写正确的文件名,我就不能把正确的名字写成字符串。
  • @NickShaw:这是个糟糕的主意。很明显,他试图流式传输的内容有问题。回到石器时代只会掩盖这个问题,并可能使问题变得更糟。

标签: c++ c windows directory listings


【解决方案1】:

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. 问题是,您在编写代码时不知道会是哪一个

根据您的构建设置,您要么拥有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

需要考虑的事情。

【讨论】:

    【解决方案2】:

    我预计您的 Unicode/ANSI 不匹配。要打印 Unicode 字符串,请使用 std::wcout

    【讨论】:

      【解决方案3】:

      您正在使用std::cout 输出一个宽字符串。请改用std::wcout

      【讨论】:

      • 如果我想将 cFileName 放入一个字符串?
      • @Yumino 你已经在使用std::wstring作为路径,继续使用。
      • @DavidHeffernan:然后当他关闭UNICODE 时,他又遇到了同样的问题。
      • @TomalakGeret'kal 在 Windows 编程中UNICODE 是您打开然后永远不会关闭的东西。尝试编写与 UNICODE 一起工作的代码,无论是开启还是关闭都会让生活变得不必要地困难。
      • @David:我想如果你的代码包含一个抽象层以便以后可移植性会更相关。使用此 OP 代码的机会很大。不过,他确实值得知道吗?
      猜你喜欢
      • 2011-01-19
      • 2011-09-02
      • 2011-09-11
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多