我正在尝试获取目录的内容。理想情况下,我想将它们存储在字符串数组中。有没有办法在c中执行此操作,而不是打开目录,迭代其内容,并在数组内填充数组?
我正在开发运行OS X 10.9的系统
答案 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)。上述代码的结构使得不需要进行显式检查,但在更复杂的用途中可能无法进行检查。