【问题标题】:Files in directory in C++C++目录中的文件
【发布时间】:2011-03-11 17:04:29
【问题描述】:

如何在 Windows 上使用 C++ 获取给定目录中的所有文件?

注意:
我找到了使用dirent.h 的方法,但我需要一个更标准的方法...

谢谢

【问题讨论】:

  • 其实dirent.h中的函数是比较标准(POSIX)的方式。
  • VC++ 2008 中不包含该文件
  • @Neil:POSIX 不是标准库的一部分,并且在最常用的操作系统 (Windows) 的最常用的 C/C++ 编译器 (MSVC) 中没有得到很好的支持。
  • @Lorenzo POSIX 是一个标准 - Windows 不是。但从你在这里的其他帖子来看,我认为争论这一点没有多大意义。
  • POSIX 是否比 Windows 更标准完全无关紧要。最初的问题显然与 Windows 有关,因此谈论 dirent.h 绝对没有意义,也没有帮助。

标签: c++ windows file directory


【解决方案1】:

使用FindFirstFile 和相关函数。示例:

HANDLE hFind;
WIN32_FIND_DATA data;

hFind = FindFirstFile("c:\\*.*", &data);
if (hFind != INVALID_HANDLE_VALUE) {
  do {
    printf("%s\n", data.cFileName);
  } while (FindNextFile(hFind, &data));
  FindClose(hFind);
}

【讨论】:

  • @Lorenzo:casablanca 使用的那个,被 MSDN 库称为“ANSI”(术语“8 位”在技术上是正确的,但似乎是我专门使用的)。仅包含它是为了与 Windows 9x 兼容。本机 API 是 UTF-16。要使用它,请在任何地方定义 UNICODE 并用通用宏 (_tprintf) 或 UTF-16 函数 (_wprintf) 替换像 printf 这样的 8 位函数,并使用带有 @ 的“宽”字符串常量987654327@ 前缀或TEXT 宏。请参阅您自己的帖子以获得更好的示例(仍然没有UNICODE,因为它应该通过编译器开关定义)。
  • @Philipp:现在更有意义了,但如果你说“8 位 API”,它几乎不会被解释为“非 UNICODE API”。在我看来,它不值得 -1,因为没有真正需要为添加 TEXT() 宏和 _txxx 函数的示例增加复杂性。
  • @Philipp:这是列出文件的示例,而不是关于文本输出的示例,printf 在这里很好地发挥了作用。我什至可以使用MessageBox 而不是printf,但是,这不是重点。
  • @casablanca:是的,这与文本输出无关,但已经有很多示例不必要地使用过时的 API,因此不需要另一个。 @Lorenzo:如果您不想添加 TEXT 宏,您可以使用宽字符串 (L"…") 代替。但您必须在 Windows 上执行其中一项操作,否则您的程序会损坏。
  • @Philipp:你混淆了UNICODE(选择Win32 API,例如FindFirstFileA/W)和_UNICODE(选择MS CRT API,例如printf/wprintf
【解决方案2】:

boost 库怎么样:文件系统。 Boost.org

【讨论】:

  • +1 表示 Boost。您可能想要链接到文件系统文档:boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
  • 这取决于“标准”一词的定义。如果你只接受 ISO 标准,那么根本就没有标准的方法。 FindFirstFile 是公认的用于列出目录条目的操作系统接口,而 Boost.Filesystem 只是 Windows 上该接口的包装器。两者都是事实上的标准。
  • Windows 的标准是尽可能远离 Win32 API。如果 Boost 提供了一个合理的替代方案,那么许多 C++ 开发人员的反应就是跳入它。
  • @Philipp:但用户询问标准方式在 WIndows 中。
  • @Lorenzo:正如我所说,这取决于您对“标准”的含义。 API 解决方案很好:它易于使用、灵活且不会引入额外的依赖项。但它不是标准化的,因为它有一个 ISO 标准。
【解决方案3】:

您必须使用FindFirstFile 函数(documented here)。这是 Windows 中的标准(也是首选)方式,但它不可移植。您找到的标头dirent.h 包含standard POSIX 函数的定义。

有关完整代码,请查看此示例:Listing the Files in a Directory

【讨论】:

    【解决方案4】:

    N1975 ISO/IEC TS 18822:2015 中描述了 C++ 的公认标准,最新草案是 N4100。您的编译器可能还没有它,在这种情况下 Boost.FileSystem 提供的基本相同。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 2020-01-29
      • 2013-12-09
      • 2012-02-06
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多