列出 c++ 中的目录在窗户下

发布于 2024-12-23 16:27:21 字数 589 浏览 1 评论 0原文

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

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

有人可以帮助我吗?

I want to list all files of the current directory, so I have this code :

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);
}

For unknown reasons, my program is displaying this result :

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

Can someone help me please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

猫性小仙女 2024-12-30 16:27:21

WIN32_FIND_DATA 结构体的成员 cFileName 是一个 TCHAR[N],并且 TCHAR 是映射到 char 的 Windows 类型别名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

需要考虑的事情。

The WIN32_FIND_DATA structure's member cFileName is a TCHAR[N], and TCHAR is a Windows type alias that maps either to char or wchar_t. Problem is, you don't know which one it will be when you write your code.

Depending on your build settings, you either have a char*, or a wchar_t*; one should be used with std::cout and the other must be used with std::wcout. But which one do you use?!

Fortunately, there's a macro to find out which is in use when you compile:

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
}

You're going to find the same problem if you try to assign the filename to a std::string/std::wstring. That's what you get for using the Windows API. :)


One way around this is to define macros for the output stream and for strings.

So, somewhere at the top of your program:

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

Then in your function, all you need is:

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

and you can use STDSTR elsewhere.

Something to consider.

相思故 2024-12-30 16:27:21

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

You are using std::cout to output a wide-character string. Use std::wcout instead.

紧拥背影 2024-12-30 16:27:21

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

I expect you have a Unicode/ANSI mismatch. To print a Unicode string, use std::wcout

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文