C++; 如何在Windows上使用C++在给定目录中获取所有文件?
注:C++; 如何在Windows上使用C++在给定目录中获取所有文件?,c++,windows,file,directory,C++,Windows,File,Directory,注: 我找到了使用dirent.h的方法,但我需要一种更标准的方法 谢谢您必须使用FindFirstFile函数()。这是Windows中的标准(也是首选)方式,但它不可移植。您找到的标题dirent.h包含函数的定义 有关完整代码,请参见此示例:使用和相关函数。例如: HANDLE hFind; WIN32_FIND_DATA data; hFind = FindFirstFile("c:\\*.*", &data); if (hFind != INVALID_HANDLE_VALU
我找到了使用
dirent.h
的方法,但我需要一种更标准的方法
谢谢您必须使用
FindFirstFile
函数()。这是Windows中的标准(也是首选)方式,但它不可移植。您找到的标题dirent.h
包含函数的定义
有关完整代码,请参见此示例:使用和相关函数。例如:
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);
}
boost库呢:文件系统。
< P> C++中所接受的标准在ISO/IEC TS 18822:2015中描述,最新草案是。您的编译器可能还没有,在这种情况下提供的基本相同。实际上,dirent.h中的函数是更标准的(POSIX)方式。但是该文件不包含在VC++中2008@Neil:POSIX不是标准库的一部分,并且最常用的操作系统中最常用的C/C++编译器(MSVC)也不支持它(窗口)@Lorenzo POSIX是标准的,Windows不是。但是从你在这里的其他帖子来看,我认为争论这一点没有多大意义。POSIX是否比Windows更标准完全无关。最初的问题显然与Windows有关,因此谈论
dirent.h
毫无意义,也没有任何帮助。+1 fo您可能想链接到文件系统文档:这取决于“标准”一词的定义如果您只接受ISO标准,那么根本就没有标准方法。FindFirstFile
是公认的用于列出目录项的操作系统接口,而Boost.Filesystem只是Windows上此接口的包装器。两者都是事实上的标准。Windows上的标准是尽可能远离Win32 API。如果Boost提供了一个明智的选择,这就是许多C++开发者的反应是跳过它。@ Philipp:但是用户在Windows中询问了标准的方式。@洛伦佐:正如我所说,这取决于你对“标准”的意思。API解决方案很好:易于使用,灵活,不引入额外的依赖项。但它没有标准化,因为有ISO标准。@Lorenzo:casablanca使用的那个,MSDN库称为“ANSI”(术语“8位”在技术上是正确的,但似乎是我专用的)。包含它只是为了与Windows 9x兼容。本机API是UTF-16。要使用它,请在任何地方定义UNICODE
,并用通用宏(\u tprintf
)或UTF-16函数(\u wprintf
)替换8位函数,如printf
),然后使用“wide”带有L
前缀或TEXT
宏的字符串常量。有关更好的示例,请参阅您自己的帖子(仍然没有UNICODE
,因为这应该通过编译器开关定义)。@Philipp:现在更有意义了,但如果您说“8位API”,它将很难被解释为“非UNICODE API”.在我看来,它不应该得到-1,因为没有必要为添加文本()的示例增加复杂性宏和函数。@Philipp:这是一个列出文件的例子,而不是关于文本输出,printf
在这里很好地发挥了作用。我甚至可以使用MessageBox
而不是printf
,但这不是重点。@casablanca:是的,这不是关于文本输出,但已经有很多这样的例子了至少,不必要地使用过时的API,而不需要另一个。@Lorenzo:如果不需要,您不必添加文本
宏,您可以使用宽字符串(L“…
)。但是您必须在Windows上执行其中一个操作,否则您的程序会崩溃。@Philipp:您把UNICODE
弄糊涂了(选择Win32 API,如FindFirstFileA/W
)和\U UNICODE
(选择MS CRT API,如printf
/wprintf
)