你如何在C中获得目录列表?

and*_*wrk 56 c directory common-tasks cross-platform file

如何在C中扫描目录中的文件夹和文件?它需要跨平台.

Cla*_*ton 73

以下POSIX程序将打印当前目录中的文件名:

#define _XOPEN_SOURCE 700
#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;
}
Run Code Online (Sandbox Code Playgroud)

图片来源:http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html

在Ubuntu 16.04中测试过.


Wil*_*ean 19

严格的答案是"你不能",因为文件夹的概念并不是真正的跨平台.

在MS平台上,您可以使用_findfirst,_findnext和_findclose来获得'c'类型的感觉,使用FindFirstFile和FindNextFile来获取基础Win32调用.

这是C-FAQ答案:

http://c-faq.com/osdep/readdir.html


con*_*gus 16

我已经创建了一个开源(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);
Run Code Online (Sandbox Code Playgroud)


And*_*ant 9

没有标准的C(或C++)方法来枚举目录中的文件.

在Windows下,您可以使用FindFirstFile/FindNextFile函数枚举目录中的所有条目.在Linux/OSX下使用opendir/readdir/closedir函数.

  • 提升也不是C. (27认同)

Isa*_*avo 7

GLib是C的可移植性/实用程序库,它构成了GTK +图形工具包的基础.它可以用作独立库.

它包含用于管理目录的可移植包装器.有关详细信息,请参阅Glib File Utilities文档.

就个人而言,我甚至不会考虑在没有像GLib这样的东西的情况下编写大量的C代码.可移植性是一回事,但是免费获取数据结构,线程助手,事件,主循环等也很好

杰克斯,我几乎开始听起来像一个销售人员:)(别担心,glib是开源的(LGPL),我不以任何方式与它有任何关联)

  • +1; 相关函数是`g_dir_read_name()` (2认同)

PW.*_*PW. 5

opendir/readdir是POSIX.如果POSIX不足以实现您想要实现的可移植性,请检查Apache Portable Runtime