你如何获得在C目录列表?
你如何扫描C目录中的文件夹和文件? 它需要是跨平台的。
以下将打印当前目录中的文件的名称:
#include <stdio.h> #include <sys/types.h> #include <dirent.h> int main (void) { DIR *dp; struct dirent *ep; dp = opendir ("./"); if (dp != NULL) { while (ep = readdir (dp)) puts (ep->d_name); (void) closedir (dp); } else perror ("Couldn't open the directory"); return 0; }
(信用: http : //www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html )
严格的答案是“你不能”,因为一个文件夹的概念并不是真正的跨平台。
在MS平台上,可以使用_findfirst,_findnext和_findclose作为“c”types,FindFirstFile和FindNextFile作为底层的Win32调用。
以下是C-FAQ的答案:
我创build了一个开源(BSD)C头来处理这个问题。 它目前支持POSIX和Windows。 请检查一下:
https://github.com/cxong/tinydir
tinydir_dir dir; tinydir_open(&dir, "/path/to/dir"); while (dir.has_next) { tinydir_file file; tinydir_readfile(&dir, &file); printf("%s", file.name); if (file.is_dir) { printf("/"); } printf("\n"); tinydir_next(&dir); } tinydir_close(&dir);
没有标准的C(或C ++)方法来枚举目录中的文件。
在Windows下,您可以使用FindFirstFile / FindNextFile函数来枚举目录中的所有条目。 在Linux / OSX下,使用opendir / readdir / closedir函数。
GLib是C的可移植性/实用程序库,它构成了GTK +graphics工具包的基础。 它可以作为一个独立的库使用。
它包含用于pipe理目录的可移植包装器。 有关详细信息,请参阅Glib File Utilities文档。
就个人而言,我甚至不会考虑写大量的C代码,而没有像GLib那样的东西。 可移植性是一回事,但获得数据结构,线程助手,事件,主循环等也是很好的
吉克斯,我几乎开始听起来像一个销售人员:)(不要担心,glib是开源(LGPL),我不以任何方式隶属于它)
opendir / readdir是POSIX。 如果POSIX不足以满足要实现的可移植性,请检查Apache Portable Runtime
根据所考虑的操作系统/平台,目录列表差别很大。 这是因为,各种操作系统使用自己的内部系统调用来实现这一点。
解决这个问题的方法是寻找一个能够解决这个问题并且可移植的库。 不幸的是,没有完美的解决scheme可以在所有平台上运行。
在POSIX兼容系统上,你可以使用库来实现这一点,使用Clayton发布的代码(最初是由W. Richard Stevens在UNIX下的高级编程中引用的)。 这个解决scheme可以在* NIX系统下运行,如果你安装了Cygwin,也可以在Windows上运行。
或者,您可以编写一个代码来检测底层操作系统,然后调用相应的目录列表function,该function将在该操作系统下列出目录结构的“正确”方式。
readdir
最相似的方法可能是使用鲜为人知的_find
系列函数 。