如何在C中扫描目录中的文件夹和文件?它需要跨平台.
以下POSIX程序将打印当前目录中的文件名:
#define _XOPEN_SOURCE 700 #include#include #include 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
在Ubuntu 16.04中测试过.
严格的答案是"你不能",因为文件夹的概念并不是真正的跨平台.
在MS平台上,您可以使用_findfirst,_findnext和_findclose来获得'c'类型的感觉,使用FindFirstFile和FindNextFile来获取基础Win32调用.
这是C-FAQ答案:
http://c-faq.com/osdep/readdir.html
我已经创建了一个开源(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 +图形工具包的基础.它可以用作独立库.
它包含用于管理目录的可移植包装器.有关详细信息,请参阅Glib File Utilities文档.
就个人而言,我甚至不会考虑在没有像GLib这样的东西的情况下编写大量的C代码.可移植性是一回事,但是免费获取数据结构,线程助手,事件,主循环等也很好
杰克斯,我几乎开始听起来像一个销售人员:)(别担心,glib是开源的(LGPL),我不以任何方式与它有任何关联)
opendir/readdir是POSIX.如果POSIX不足以实现您想要实现的可移植性,请检查Apache Portable Runtime