【问题标题】:Listing Folders in a Directory C+列出目录 C++ 中的文件夹
【发布时间】:2013-12-25 15:43:28
【问题描述】:

我知道这很可能是重复的。但是,我很难真正得到一个有效的答案。

我要做的是列出工作目录中的所有文件夹。以下是我从 MS 网站 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200(v=vs.85).aspx) 改编的一些代码

这给出了输出:

Filname:52428

我已经检查了文件夹 - 我想列出三个文件夹 'Vidoe' 'John' 'David' 我不确定为什么它会打印出上面的结果。

我不想使用 Boost - 也不想下载任何第三方插件。

int main(int argc, char** argv) 
{   
    HANDLE hFind = INVALID_HANDLE_VALUE;
    WIN32_FIND_DATA ffd;
//The Directory where the .exe is run from.

    hFind = FindFirstFile(TEXT(".\\Players\\*"), &ffd);
    do
    {
        Sleep(1000);
        bool isDirectory = ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
        if(isDirectory)
        {
            cout << "DirectoryName: " << *ffd.cFileName << endl;
        }
        else
        {
            cout << "FileName: " << *ffd.cFileName << endl;
        }
    }while(FindNextFile(hFind, &ffd) != 0);
    FindClose(hFind);
}

编辑: 我没有要执行此操作的特定方法,我想做的只是输出目录中的文件夹-我不在乎它是如何完成的。

【问题讨论】:

  • 得到错误:文件名:???????????????????????????????????? ???????????????????????????????????? ??????????????????????????????????????????????????? ?????????????????????????????? ??????????????????????????????????????????????????? ?????????????????????????????? ??????????????????????????????????????????????????? ?????=?G???=?g☺ 按任意键继续。 . .
  • 您应该在继续之前检查 hFind 的值。我敢打赌你会拿回来 INVALID_HANDLE_VALUE 因为什么都没找到。
  • 您是否在 Visual Studio 调试器中运行它?请记住,用于调试的默认应用程序路径不是包含可执行文件的文件夹。它是包含解决方案文件的文件夹。
  • 我正在使用 Visual Studio 运行它。我在我的程序中的其他地方使用相同的“.\\Players\*”字符串以产生很好的效果。
  • 然后确保将调试器的工作目录调整到exe的文件夹。这是在项目设置的调试选项卡中。

标签: c++ file-io directory


【解决方案1】:

在……

*ffd.cFileName

删除*


同时删除对Sleep的调用。


同时删除愚蠢的TEXT 宏调用,使用像L"blah" 这样的宽字符串文字。


哦,我忘了,还要用while 循环(或for 循环)替换do 循环,因为不确定FindFirstFile 调用是否会成功。


哦,重要,调试输出使用wcout,而不是cout。后者对 Unicode 字符串的输出一无所知。但是wcout 可以处理它们。

你得到的输出,

52428

貌似是wchar_t值0xCCCC,被cout当作整数处理,该值表示存储未初始化,这意味着FindFirstFile调用失败。


因此,在运行程序时还要确定当前目录。一个好主意是从命令行运行它。那你就确定了。

【讨论】:

  • 这很好。完美!如何将字符串变量与 L(string) 一起使用?
  • @KingJohnno:取决于String 的类型。第一个大写字母不是std::string,但它可能是MFC/ATL String(它可以正确处理宽字符串)。无论如何,请检查其文档。
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2014-01-06
  • 2020-01-29
相关资源
最近更新 更多