C OS X将目录内容读入字符串数组

时间:2014-01-24 12:26:00

标签: c macos directory osx-mavericks

我正在尝试获取目录的内容。理想情况下,我想将它们存储在字符串数组中。有没有办法在c中执行此操作,而不是打开目录,迭代其内容,并在数组内填充数组?

我正在开发运行OS X 10.9的系统

2 个答案:

答案 0 :(得分:2)

您可能希望使用系统libc调用和fopen运行。

以下是示例代码,处理所有数组长度,此处没有进行验证。     #包括     #包括     的#include

int
main(int argc, char* argv[])
{
     char cmd[254] = "ls ";
     char arr[1024];
     char line[254];
     FILE *fp;
     if(argc < 2) return -1;
     if(argv[1]) strcat(cmd, argv[1]);
      strcat(cmd, " > /tmp/out");
     system(cmd);

     fp = fopen("/tmp/out", "r");
     if(!fp){
       perror("");
       return fprintf(stderr, "could not open /tmp/out!\n");
     }
     while(fgets(line, 254, fp) != NULL) {
        strcat(arr, line);
     }
     printf("%s\n", arr);
     return 0;
}

答案 1 :(得分:2)

您可以使用POSIX scandir函数获取已分配的目录列表,该函数采用路径和可选的过滤和排序回调,并返回dirent个结构的数组。 OS X还提供an equivalent function,它采用块而不是回调进行排序和过滤。

int scandir(const char *dirname, struct dirent ***namelist,
            int (*select)(const struct dirent *),
            int (*compar)(const struct dirent **, const struct dirent **));

只检索未排序的条目列表非常简单:

int num_entries;
struct dirent **entries = NULL;

num_entries = scandir("/", &entries, NULL, NULL);

for(int i = 0; i < num_entries; i++)
    puts(entries[i]->d_name);

//entries is ours to free
for(int i = 0; i < num_entries; i++)
    free(entries[i]);
free(entries);

POSIX还提供预先制作的排序功能,以便与scandir一起使用,以按字母顺序排序。要使用它,只需将alphasort作为最后一个参数传递。

小心scandir返回错误(-1)。上述代码的结构使得不需要进行显式检查,但在更复杂的用途中可能无法进行检查。